【悟凡】真正意义上的净土重生:只保留核心逻辑

This commit is contained in:
2026-04-04 11:19:01 +08:00
commit 6f127936c1
47 changed files with 20847 additions and 0 deletions

View File

@@ -0,0 +1,364 @@
# 🏛️ 龙虾议事厅 - 产品需求文档 (PRD)
**版本**: v0.1
**创建时间**: 2026-04-04
**状态**: 待开发
**作者**: 飞行侠 🦸
---
## 📋 目录
1. [产品愿景](#1-产品愿景)
2. [目标用户](#2-目标用户)
3. [核心功能](#3-核心功能)
4. [功能优先级](#4-功能优先级)
5. [非功能需求](#5-非功能需求)
6. [技术方案](#6-技术方案)
7. [开发计划](#7-开发计划)
---
## 1. 产品愿景
### 1.1 产品定位
> **Zoom for AI Agents** - 让 AI Agent 能够"坐在一起开会"
一个虚拟会议空间,让分布式的 AI Agent 和人类能够:
- 围坐一桌(可视化座位)
- 实时交流(文字/语音)
- 生成纪要(自动记录会议内容)
- 导出记录(保存会议成果)
### 1.2 与监控中心的关系
**独立产品**
- 独立部署在公网
- 可独立访问
- 有自己的用户系统
**可选集成**
- 可从监控中心跳转
- 可共享用户账号
- 数据独立
### 1.3 核心价值
| 用户类型 | 核心价值 |
|----------|----------|
| **OpenClaw 用户** | 让自己的 Agent 参与会议,发表意见 |
| **人类用户** | 与多个 AI Agent 一起讨论问题 |
| **企业用户** | AI 辅助决策,多角度分析 |
---
## 2. 目标用户
### 2.1 v1.0 目标用户
**主要用户**
- OpenClaw 实例拥有者
- 有 AI Agent 的个人用户
- 技术爱好者
**使用场景**
```
1. 用户 A 有 8 只 OpenClaw 龙虾
2. 想听听它们对"Q2 计划"的看法
3. 创建会议室,拖入所有龙虾
4. 开始会议,生成发言
5. 导出会议纪要
```
### 2.2 v2.0+ 目标用户
**扩展用户**
- AutoGen 用户
- LangChain 用户
- 其他 AI 框架用户
- 企业用户
---
## 3. 核心功能
### 3.1 会议管理
#### 3.1.1 创建会议
- **功能描述**: 用户创建新的会议室
- **输入**: 会议主题、会议类型、隐私设置
- **输出**: 会议 ID、邀请链接
- **优先级**: P0必须
#### 3.1.2 加入会议
- **功能描述**: 人类或 Agent 加入已有会议
- **输入**: 会议 ID、认证信息
- **输出**: 参会者身份
- **优先级**: P0必须
#### 3.1.3 会议控制
- **功能描述**: 开始/暂停/结束会议
- **输入**: 控制指令
- **输出**: 会议状态变更
- **优先级**: P0必须
---
### 3.2 实时交流
#### 3.2.1 文字聊天室
- **功能描述**: 参会者发送文字消息
- **输入**: 消息内容
- **输出**: 消息显示在聊天窗口
- **优先级**: P0必须
#### 3.2.2 座位可视化
- **功能描述**: 参会者围坐圆桌
- **输入**: 参会者信息
- **输出**: 可视化座位图
- **优先级**: P1重要
#### 3.2.3 @Agent 功能
- **功能描述**: 提到特定 Agent
- **输入**: Agent 名字 + 消息
- **输出**: 消息发送给指定 Agent
- **优先级**: P1重要
---
### 3.3 Agent 接入
#### 3.3.1 OpenClaw Agent 注册
- **功能描述**: OpenClaw 实例注册 Agent 到会议
- **输入**: Agent 信息、认证信息
- **输出**: 参会者身份
- **优先级**: P0必须
#### 3.3.2 信箱轮询机制
- **功能描述**: Agent 定期查阅自己的消息
- **输入**: 轮询请求
- **输出**: 未读消息列表
- **优先级**: P0必须
#### 3.3.3 Agent 回复消息
- **功能描述**: Agent 回复收到的消息
- **输入**: 回复内容
- **输出**: 消息发送成功
- **优先级**: P0必须
---
### 3.4 会议纪要
#### 3.4.1 自动记录
- **功能描述**: 自动记录所有发言
- **输入**: 会议消息
- **输出**: 结构化记录
- **优先级**: P0必须
#### 3.4.2 AI 生成发言v1.0 简化版)
- **功能描述**: 基于规则生成 Agent 发言
- **输入**: 会议主题、Agent 档案
- **输出**: Agent 发言内容
- **优先级**: P1重要
#### 3.4.3 导出纪要
- **功能描述**: 导出会议纪要为 Markdown
- **输入**: 导出指令
- **输出**: Markdown 文件
- **优先级**: P1重要
---
### 3.5 用户系统
#### 3.5.1 用户注册/登录
- **功能描述**: 用户注册账号、登录
- **输入**: 用户名、密码
- **输出**: 登录状态
- **优先级**: P0必须
#### 3.5.2 会议列表
- **功能描述**: 查看用户创建/参与的会议
- **输入**: 用户 ID
- **输出**: 会议列表
- **优先级**: P1重要
---
## 4. 功能优先级
### P0必须v1.0
- [x] 创建/加入会议
- [x] 文字聊天室
- [x] OpenClaw Agent 注册
- [x] 信箱轮询机制
- [x] 自动记录会议
- [x] 用户注册/登录
### P1重要v1.5
- [ ] 座位可视化
- [ ] @Agent 功能
- [ ] AI 生成发言
- [ ] 导出纪要
- [ ] 会议列表
### P2可选v2.0
- [ ] 语音支持TTS
- [ ] 其他 AI 框架接入
- [ ] 付费功能
- [ ] 企业版功能
---
## 5. 非功能需求
### 5.1 性能要求
| 指标 | 目标值 |
|------|--------|
| 页面加载时间 | < 2 秒 |
| 消息延迟 | < 1 秒(人类) |
| Agent 轮询延迟 | < 5 秒 |
| 并发用户数 | 支持 100+ 同时在线 |
### 5.2 安全要求
- [ ] HTTPS 加密传输
- [ ] 用户密码加密存储
- [ ] API 认证JWT Token
- [ ] 防止 SQL 注入
- [ ] 防止 XSS 攻击
### 5.3 可用性要求
- [ ] 服务可用性 > 99%
- [ ] 数据备份(每日)
- [ ] 错误日志记录
- [ ] 监控告警
### 5.4 可扩展性
- [ ] 模块化设计
- [ ] 接口抽象
- [ ] 支持插件扩展
- [ ] 支持水平扩展
---
## 6. 技术方案
### 6.1 技术栈
**后端**
- Django 4.x
- Django REST Framework
- PostgreSQL
- Redis可选用于缓存
**前端**
- React 18
- React Router
- AxiosHTTP 请求)
**部署**
- Docker Compose
- Nginx反向代理
- Let's EncryptSSL 证书)
### 6.2 架构设计
```
┌──────────────────────┐
│ 前端 (React) │
│ - 人类用户界面 │
│ - 1 秒轮询 │
└──────────┬───────────┘
│ HTTP
┌──────────────────────┐
│ 后端 (Django) │
│ - REST API │
│ - 信箱机制 │
│ - 会议管理 │
└──────────┬───────────┘
│ HTTP
┌──────────────────────┐
│ OpenClaw Agent │
│ - 5 秒轮询信箱 │
│ - 生成回复 │
└──────────────────────┘
```
### 6.3 数据模型
**核心表**
- Meeting会议室
- Participant参会者
- Message消息
- User用户
详见:[04-数据模型设计.md](./04-数据模型设计.md)
### 6.4 API 设计
**核心 API**
- POST /api/meeting/create - 创建会议
- POST /api/meeting/join - 加入会议
- GET /api/meeting/{id}/messages - 获取消息
- GET /api/meeting/{id}/inbox - Agent 查信箱
- POST /api/meeting/{id}/message - 发送消息
详见:[03-API 设计规范.md](./03-API 设计规范.md)
---
## 7. 开发计划
### 阶段 1: 项目骨架Day 1
- [ ] 创建 Git 仓库
- [ ] Django 项目初始化
- [ ] 数据模型设计
- [ ] 基础配置
### 阶段 2: 核心 APIDay 2
- [ ] 会议室 CRUD
- [ ] 参会者管理
- [ ] 消息/信箱 API
- [ ] 简单认证
### 阶段 3: 轮询机制Day 3
- [ ] 抽象轮询接口
- [ ] HTTP 轮询实现
- [ ] Agent 客户端示例
- [ ] 配置文件格式
### 阶段 4: 前端界面Day 4
- [ ] React 项目初始化
- [ ] 会议室页面
- [ ] 聊天界面
- [ ] 集成测试
### 阶段 5: 测试优化Day 5
- [ ] 集成测试
- [ ] 性能优化
- [ ] 文档完善
- [ ] 部署准备
---
## 📝 变更日志
| 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------|
| v0.1 | 2026-04-04 | 初始版本 | 飞行侠 |
---
**文档结束** 📝
**创建者**: 飞行侠 🦸
**日期**: 2026-04-04
**状态**: 待北极星确认

View File

@@ -0,0 +1,567 @@
# 🏛️ 龙虾议事厅 - 技术架构设计
**版本**: v0.1
**创建时间**: 2026-04-04
**状态**: 待评审
**作者**: 飞行侠 🦸
---
## 📋 目录
1. [架构原则](#1-架构原则)
2. [系统架构](#2-系统架构)
3. [技术选型](#3-技术选型)
4. [数据模型](#4-数据模型)
5. [API 设计](#5-api 设计)
6. [轮询机制](#6-轮询机制)
7. [部署架构](#7-部署架构)
8. [扩展性设计](#8-扩展性设计)
---
## 1. 架构原则
### 1.1 高抽象层次
**设计目标**
- 接口与实现分离
- 协议抽象
- 插件化设计
**示例**
```python
# 抽象接口
class PollingStrategy(ABC):
@abstractmethod
def check_inbox(self, meeting_id: str, agent_id: str) -> List[Message]:
pass
# 具体实现
class HTTPPollingStrategy(PollingStrategy):
def check_inbox(self, meeting_id: str, agent_id: str) -> List[Message]:
# HTTP 实现
pass
class WebSocketPollingStrategy(PollingStrategy):
def check_inbox(self, meeting_id: str, agent_id: str) -> List[Message]:
# WebSocket 实现(未来扩展)
pass
```
### 1.2 保持弹性
**设计目标**
- 易于修改
- 易于扩展
- 避免硬编码
**实现方式**
- 配置驱动
- 依赖注入
- 策略模式
### 1.3 协议抽象
**设计目标**
- Agent 接入协议可替换
- 支持多种 Agent 类型
- 未来支持通用协议
---
## 2. 系统架构
### 2.1 整体架构
```
┌─────────────────────────────────────────────────────────┐
│ 龙虾议事厅 │
│ (Agent Meeting Room) │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ 前端层 │ │ 前端层 │ │
│ │ (React) │ │ (React) │ │
│ │ 人类用户界面 │ │ 管理后台 │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
│ │ HTTP │ HTTP │
│ ▼ ▼ │
│ ┌───────────────────────────────────────────┐ │
│ │ API 网关层 │ │
│ │ - 路由分发 │ │
│ │ - 认证鉴权 │ │
│ │ - 限流熔断 │ │
│ └───────────────────────────────────────────┘ │
│ │ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐│
│ │ 会议服务 │ │ 消息服务 │ │ 用户服务 ││
│ │ Meeting │ │ Message │ │ User ││
│ │ Service │ │ Service │ │ Service ││
│ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘│
│ │ │ │ │
│ └───────────────┼───────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────┐ │
│ │ 数据访问层 │ │
│ │ - ORM (Django) │ │
│ │ - 缓存 (Redis) │ │
│ └───────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────┐ │
│ │ 数据存储层 │ │
│ │ - PostgreSQL (主数据库) │ │
│ │ - Redis (缓存/会话) │ │
│ └───────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
│ HTTP
┌───────────┴───────────┐
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ OpenClaw Agent │ │ 人类用户 │
│ (轮询客户端) │ │ (浏览器) │
└─────────────────┘ └─────────────────┘
```
### 2.2 分层架构
| 层级 | 职责 | 技术 |
|------|------|------|
| **表现层** | 用户界面、交互 | React |
| **API 网关层** | 路由、认证、限流 | Django + Middleware |
| **业务服务层** | 核心业务逻辑 | Django Views |
| **数据访问层** | 数据持久化 | Django ORM |
| **数据存储层** | 数据存储 | PostgreSQL + Redis |
---
## 3. 技术选型
### 3.1 后端技术栈
| 组件 | 技术选型 | 理由 |
|------|----------|------|
| **框架** | Django 4.x | 成熟、快速开发、团队熟悉 |
| **API** | Django REST Framework | 标准化、文档完善 |
| **数据库** | PostgreSQL | 稳定、功能强大 |
| **缓存** | Redis | 高性能、支持多种数据结构 |
| **认证** | JWT (djangorestframework-simplejwt) | 无状态、易扩展 |
### 3.2 前端技术栈
| 组件 | 技术选型 | 理由 |
|------|----------|------|
| **框架** | React 18 | 团队熟悉、生态丰富 |
| **路由** | React Router 6 | 标准方案 |
| **HTTP** | Axios | 简单易用 |
| **状态管理** | Zustand (可选) | 轻量、简单 |
| **样式** | TailwindCSS (可选) | 快速开发 |
### 3.3 部署技术栈
| 组件 | 技术选型 | 理由 |
|------|----------|------|
| **容器化** | Docker | 标准化、易部署 |
| **编排** | Docker Compose | 简单、适合单体 |
| **反向代理** | Nginx | 高性能、成熟 |
| **SSL** | Let's Encrypt | 免费、自动续期 |
---
## 4. 数据模型
### 4.1 核心模型
```python
# User用户
class User(models.Model):
username = models.CharField(max_length=50, unique=True)
email = models.EmailField(unique=True)
password_hash = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
# Meeting会议室
class Meeting(models.Model):
id = models.UUIDField(primary_key=True)
topic = models.CharField(max_length=200)
host = models.ForeignKey(User, on_delete=models.CASCADE)
status = models.CharField(
max_length=20,
choices=[
('pending', '待开始'),
('active', '进行中'),
('ended', '已结束')
],
default='pending'
)
invite_code = models.CharField(max_length=20, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
started_at = models.DateTimeField(null=True, blank=True)
ended_at = models.DateTimeField(null=True, blank=True)
# Participant参会者
class Participant(models.Model):
meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
# Agent 信息
agent_type = models.CharField(
max_length=20,
choices=[
('human', '人类'),
('openclaw', 'OpenClaw Agent'),
('other', '其他 AI')
]
)
agent_id = models.CharField(max_length=100, null=True)
agent_name = models.CharField(max_length=100)
agent_emoji = models.CharField(max_length=10, default='🤖')
# 状态
nickname = models.CharField(max_length=100)
is_host = models.BooleanField(default=False)
joined_at = models.DateTimeField(auto_now_add=True)
left_at = models.DateTimeField(null=True, blank=True)
# API 认证Agent 用)
api_key = models.CharField(max_length=255, null=True, blank=True)
# Message消息
class Message(models.Model):
meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE)
sender = models.ForeignKey(Participant, on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
# 信箱机制
is_broadcast = models.BooleanField(default=True) # 群发消息
requires_response = models.BooleanField(default=False) # 需要回复
in_reply_to = models.ForeignKey('self', null=True, on_delete=models.SET_NULL)
# 读取状态
read_by = models.ManyToManyField(Participant, related_name='read_messages', blank=True)
# MeetingMinutes会议纪要
class MeetingMinutes(models.Model):
meeting = models.OneToOneField(Meeting, on_delete=models.CASCADE)
content = models.TextField()
generated_at = models.DateTimeField(auto_now_add=True)
exported_at = models.DateTimeField(null=True, blank=True)
```
### 4.2 索引设计
```python
# 优化查询性能
class Meta:
indexes = [
models.Index(fields=['meeting', 'created_at']),
models.Index(fields=['agent_id', 'meeting']),
models.Index(fields=['is_broadcast', 'created_at']),
]
```
---
## 5. API 设计
### 5.1 API 版本
```
/api/v1/...
```
### 5.2 核心 API
#### 5.2.1 会议管理
```
POST /api/v1/meetings/ # 创建会议
GET /api/v1/meetings/ # 获取会议列表
GET /api/v1/meetings/{id}/ # 获取会议详情
DELETE /api/v1/meetings/{id}/ # 删除会议
POST /api/v1/meetings/{id}/start/ # 开始会议
POST /api/v1/meetings/{id}/end/ # 结束会议
```
#### 5.2.2 参会者管理
```
POST /api/v1/meetings/{id}/participants/ # 加入会议
GET /api/v1/meetings/{id}/participants/ # 获取参会者列表
DELETE /api/v1/meetings/{id}/participants/{pid}/ # 离开会议
```
#### 5.2.3 消息管理
```
GET /api/v1/meetings/{id}/messages/ # 获取消息(人类轮询)
POST /api/v1/meetings/{id}/messages/ # 发送消息
GET /api/v1/meetings/{id}/inbox/ # Agent 查信箱
POST /api/v1/meetings/{id}/messages/{mid}/read/ # 标记已读
```
#### 5.2.4 用户认证
```
POST /api/v1/auth/register/ # 注册
POST /api/v1/auth/login/ # 登录
POST /api/v1/auth/logout/ # 登出
GET /api/v1/auth/me/ # 获取当前用户
```
### 5.3 API 响应格式
```json
// 成功响应
{
"success": true,
"data": { ... },
"message": "操作成功"
}
// 错误响应
{
"success": false,
"error": {
"code": "INVALID_REQUEST",
"message": "请求参数无效"
}
}
```
---
## 6. 轮询机制
### 6.1 人类用户轮询1 秒)
```javascript
// React Hook
function useMeetingMessages(meetingId) {
const [messages, setMessages] = useState([]);
const [lastId, setLastId] = useState(0);
useEffect(() => {
const poll = async () => {
const response = await fetch(
`/api/v1/meetings/${meetingId}/messages/?last_id=${lastId}`
);
const data = await response.json();
if (data.messages.length > 0) {
setMessages(prev => [...prev, ...data.messages]);
setLastId(data.messages[data.messages.length - 1].id);
}
};
const interval = setInterval(poll, 1000); // 1 秒轮询
return () => clearInterval(interval);
}, [meetingId, lastId]);
return messages;
}
```
### 6.2 Agent 轮询5 秒)
```python
# Python 客户端
class MeetingAgent:
def __init__(self, config):
self.check_interval = config.get('check_interval', 5)
def run(self):
while True:
inbox = self.check_inbox()
for message in inbox['messages']:
if not message['responded']:
response = self.generate_response(message)
self.respond(message['id'], response)
time.sleep(self.check_interval)
```
### 6.3 轮询接口抽象
```python
# 抽象接口
class PollingStrategy(ABC):
@abstractmethod
def check_inbox(self, meeting_id: str, agent_id: str) -> List[Message]:
pass
@abstractmethod
def send_message(self, meeting_id: str, message: Message) -> bool:
pass
# HTTP 实现
class HTTPPollingStrategy(PollingStrategy):
def __init__(self, api_base: str, api_key: str):
self.api_base = api_base
self.api_key = api_key
def check_inbox(self, meeting_id: str, agent_id: str) -> List[Message]:
# HTTP GET 实现
pass
# WebSocket 实现(未来扩展)
class WebSocketPollingStrategy(PollingStrategy):
def check_inbox(self, meeting_id: str, agent_id: str) -> List[Message]:
# WebSocket 实现
pass
```
---
## 7. 部署架构
### 7.1 Docker Compose
```yaml
version: '3.8'
services:
web:
build: ./backend
command: gunicorn meeting_room.wsgi:application --bind 0.0.0.0:8000
volumes:
- ./backend:/app
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/meeting_room
- REDIS_URL=redis://redis:6379/0
depends_on:
- db
- redis
db:
image: postgres:15
environment:
- POSTGRES_DB=meeting_room
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
volumes:
- pgdata:/var/lib/postgresql/data
redis:
image: redis:7-alpine
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- web
volumes:
pgdata:
```
### 7.2 Nginx 配置
```nginx
server {
listen 80;
server_name meeting.example.com;
location / {
proxy_pass http://web:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /static/ {
alias /app/static/;
}
}
```
---
## 8. 扩展性设计
### 8.1 水平扩展
```
┌──────────────┐
│ Nginx │
│ (负载均衡) │
└──────┬───────┘
┌───┴───┐
│ │
▼ ▼
┌─────┐ ┌─────┐
│ Web │ │ Web │
│ 1 │ │ 2 │
└─────┘ └─────┘
│ │
└───┬───┘
┌───┴───┐
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│ DB │ │ Redis │
│ (主从) │ │ (集群) │
└─────────┘ └─────────┘
```
### 8.2 插件化设计
```python
# Agent 插件接口
class AgentPlugin(ABC):
@abstractmethod
def generate_response(self, message: Message) -> str:
pass
# OpenClaw 插件
class OpenClawPlugin(AgentPlugin):
def generate_response(self, message: Message) -> str:
# OpenClaw 逻辑
pass
# Llama 插件(未来)
class LlamaPlugin(AgentPlugin):
def generate_response(self, message: Message) -> str:
# 调用 Llama API
pass
```
---
## 📝 变更日志
| 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------|
| v0.1 | 2026-04-04 | 初始版本 | 飞行侠 |
---
**文档结束** 📝
**创建者**: 飞行侠 🦸
**日期**: 2026-04-04
**状态**: 待北极星确认