Files
life-echo/docs/v1_features_server.md
iammm0 71c70275a8 docs: 更新文档与 demo
- 更新 docs/ 与 app-ios/docs/
- 更新 app-ios/demo、assets/demo、app-ios 代码与计划

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-13 10:05:20 +08:00

826 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 岁月时书 - 服务端需求文档 V1
> **产品定位**:为「岁月时书」客户端提供 AI 对话、回忆录生成、用户管理等核心后端服务。
---
## 1. 系统概述
### 1.1 核心职责
- 管理用户对话与消息
- 提供 AI 引导式对话能力
- 自动整理对话生成回忆录
- 用户账户与套餐管理
### 1.2 技术架构概览
```
┌─────────────────────────────────────────────────────────┐
│ 客户端 (App) │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ API Gateway │
│ (认证/限流/路由) │
└─────────────────────────────────────────────────────────┘
┌───────────────────┼───────────────────┐
▼ ▼ ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 对话服务 │ │ 回忆录服务 │ │ 用户服务 │
│ Chat Service │ │ Memoir Service│ │ User Service │
└───────────────┘ └───────────────┘ └───────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────────┐
│ 数据存储层 │
│ (PostgreSQL / Redis / OSS) │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ AI 服务层 │
│ (LLM API / ASR 语音转写) │
└─────────────────────────────────────────────────────────┘
```
---
## 2. API 设计
### 2.1 基础约定
- **协议**HTTPS
- **格式**JSON
- **认证**Bearer Token (JWT)
- **版本**`/api/v1/`
### 2.2 响应格式
**成功响应**
```json
{
"code": 0,
"message": "success",
"data": { ... }
}
```
**错误响应**
```json
{
"code": 10001,
"message": "错误描述",
"data": null
}
```
**错误码规范**
| 错误码范围 | 类型 |
|-----------|------|
| 10000-19999 | 通用错误 |
| 20000-29999 | 用户模块错误 |
| 30000-39999 | 对话模块错误 |
| 40000-49999 | 回忆录模块错误 |
---
## 3. 功能模块 API
### 3.1 用户模块
#### 3.1.1 用户注册V1 占位)
```
POST /api/v1/auth/register
```
**请求参数**
```json
{
"phone": "13800138000",
"code": "123456",
"nickname": "李明华"
}
```
**响应数据**
```json
{
"user_id": "u_xxxxx",
"token": "jwt_token_xxxxx",
"expires_at": "2024-12-31T23:59:59Z"
}
```
#### 3.1.2 用户登录V1 占位)
```
POST /api/v1/auth/login
```
**请求参数**
```json
{
"phone": "13800138000",
"code": "123456"
}
```
#### 3.1.3 获取用户信息
```
GET /api/v1/user/profile
```
**响应数据**
```json
{
"user_id": "u_xxxxx",
"nickname": "李明华",
"avatar_url": null,
"plan_type": "free",
"plan_label": "免费体验版",
"created_at": "2024-01-01T00:00:00Z"
}
```
#### 3.1.4 更新用户信息
```
PUT /api/v1/user/profile
```
**请求参数**
```json
{
"nickname": "新昵称",
"avatar_url": "https://..."
}
```
---
### 3.2 对话模块
#### 3.2.1 获取对话列表
```
GET /api/v1/conversations
```
**说明**
- V1 版本每个用户仅有一个默认对话「回忆录助手」
- 用户首次访问时自动创建
- 不支持用户手动创建新对话(后续版本支持多 Agent
**响应数据**
```json
{
"conversations": [
{
"id": "conv_xxxxx",
"title": "回忆录助手",
"avatar_emoji": "📖",
"last_message": "您想从哪里开始呢?可以聊聊童年...",
"last_message_at": "2024-01-15T14:30:00Z",
"unread_count": 0,
"type": "system"
}
],
"total": 1,
"has_more": false
}
```
#### 3.2.2 创建新对话(后续版本)
```
POST /api/v1/conversations
```
**说明**V1 暂不开放,后续版本支持多 Agent 时启用
**请求参数**
```json
{
"type": "custom",
"title": "关于童年的回忆",
"agent_type": "memoir_assistant"
}
```
**响应数据**
```json
{
"id": "conv_xxxxx",
"title": "关于童年的回忆",
"created_at": "2024-01-15T15:00:00Z"
}
```
#### 3.2.3 获取对话消息列表
```
GET /api/v1/conversations/:id/messages
```
**查询参数**
| 参数 | 类型 | 说明 |
|-----|------|------|
| before | string | 游标,获取此消息之前的内容 |
| limit | int | 每页数量,默认 50 |
**响应数据**
```json
{
"messages": [
{
"id": "msg_xxxxx",
"sender_type": "ai",
"content_type": "text",
"content": "您好!我是您的回忆录助手...",
"created_at": "2024-01-15T14:30:00Z"
},
{
"id": "msg_yyyyy",
"sender_type": "user",
"content_type": "text",
"content": "我想聊聊我的童年",
"created_at": "2024-01-15T14:31:00Z"
}
],
"has_more": false
}
```
#### 3.2.4 发送消息
```
POST /api/v1/conversations/:id/messages
```
**请求参数(文字消息)**
```json
{
"content_type": "text",
"content": "我出生在一个小村庄..."
}
```
**请求参数(语音消息)**
```json
{
"content_type": "audio",
"content": "https://oss.example.com/audio/xxxxx.m4a",
"metadata": {
"duration": 15
}
}
```
**请求参数(图片消息,后续版本)**
```json
{
"content_type": "image",
"content": "https://oss.example.com/images/xxxxx.jpg",
"metadata": {
"width": 1080,
"height": 720
}
}
```
**响应数据**
```json
{
"user_message": {
"id": "msg_xxxxx",
"sender_type": "user",
"content_type": "text",
"content": "我出生在一个小村庄...",
"created_at": "2024-01-15T14:35:00Z"
},
"ai_response": {
"id": "msg_yyyyy",
"sender_type": "ai",
"content_type": "text",
"content": "这个开头真让人期待!能再详细说说那个村庄是什么样的吗?",
"created_at": "2024-01-15T14:35:02Z"
}
}
```
#### 3.2.5 上传音频文件
```
POST /api/v1/upload/audio
Content-Type: multipart/form-data
```
**请求参数**
| 参数 | 类型 | 说明 |
|-----|------|------|
| file | File | 音频文件M4A/AAC|
| duration | int | 音频时长(秒)|
**响应数据**
```json
{
"url": "https://oss.example.com/audio/xxxxx.m4a",
"duration": 15,
"transcription": "我出生在一个小村庄,那时候家里很穷..."
}
```
**处理流程**
1. 接收音频文件
2. 上传至 OSS 存储
3. 调用语音识别服务ASR转写
4. 返回音频 URL 和转写文本
#### 3.2.6 流式消息接口(可选增强)
```
POST /api/v1/conversations/:id/messages/stream
```
**说明**:使用 Server-Sent Events (SSE) 实现 AI 回复的流式输出
**事件类型**
```
event: message_start
data: {"message_id": "msg_xxxxx"}
event: content_delta
data: {"delta": "这个"}
event: content_delta
data: {"delta": "开头"}
event: message_end
data: {"message_id": "msg_xxxxx"}
```
---
### 3.3 回忆录模块
#### 3.3.1 获取用户回忆录
```
GET /api/v1/memoir
```
**响应数据**
```json
{
"id": "memoir_xxxxx",
"title": "这一生",
"subtitle": "我的回忆录",
"updated_at": "2024-01-15T14:35:00Z",
"word_count": 3500,
"chapter_count": 4
}
```
#### 3.3.2 获取章节列表
```
GET /api/v1/memoir/chapters
```
**响应数据**
```json
{
"chapters": [
{
"id": "chapter_001",
"number": 1,
"title": "童年与家庭",
"status": "complete",
"page_count": 3,
"word_count": 1200,
"updated_at": "2024-01-15T14:00:00Z"
},
{
"id": "chapter_002",
"number": 2,
"title": "上学的日子",
"status": "partial",
"page_count": 2,
"word_count": 600,
"updated_at": "2024-01-15T14:30:00Z"
},
{
"id": "chapter_003",
"number": 3,
"title": "工作与事业",
"status": "pending",
"page_count": 0,
"word_count": 0,
"updated_at": null
}
]
}
```
#### 3.3.3 获取章节内容
```
GET /api/v1/memoir/chapters/:id
```
**响应数据**
```json
{
"id": "chapter_001",
"number": 1,
"title": "童年与家庭",
"status": "complete",
"content": "我出生在一个普通的农村家庭...\n\n\"日子虽然清苦,但那时候的快乐是最纯粹的。\"\n\n父亲是村里的木匠...",
"images": [
{
"id": "img_001",
"url": "https://...",
"caption": "老家的院子",
"position": 3
}
],
"updated_at": "2024-01-15T14:00:00Z"
}
```
#### 3.3.4 获取完整回忆录
```
GET /api/v1/memoir/full
```
**响应数据**
```json
{
"id": "memoir_xxxxx",
"title": "这一生",
"subtitle": "我的回忆录",
"chapters": [
{
"id": "chapter_001",
"number": 1,
"title": "童年与家庭",
"content": "...",
"images": []
},
{
"id": "chapter_002",
"number": 2,
"title": "上学的日子",
"content": "...",
"images": []
}
],
"updated_at": "2024-01-15T14:35:00Z"
}
```
#### 3.3.5 导出回忆录V1 占位)
```
POST /api/v1/memoir/export
```
**请求参数**
```json
{
"format": "pdf",
"chapters": ["chapter_001", "chapter_002"]
}
```
**响应数据**
```json
{
"task_id": "export_xxxxx",
"status": "processing",
"estimated_time": 30
}
```
```
GET /api/v1/memoir/export/:task_id
```
**响应数据**
```json
{
"task_id": "export_xxxxx",
"status": "completed",
"download_url": "https://...",
"expires_at": "2024-01-16T14:35:00Z"
}
```
---
## 4. 数据模型
### 4.1 数据库 Schema
#### 用户表 (users)
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | VARCHAR(32) | 主键,如 u_xxxxx |
| phone | VARCHAR(20) | 手机号,唯一 |
| nickname | VARCHAR(50) | 昵称 |
| avatar_url | VARCHAR(500) | 头像 URL |
| plan_type | ENUM | 套餐类型free/premium |
| created_at | TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 更新时间 |
#### 对话表 (conversations)
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | VARCHAR(32) | 主键,如 conv_xxxxx |
| user_id | VARCHAR(32) | 用户 ID外键 |
| title | VARCHAR(100) | 对话标题 |
| type | ENUM | 类型system/custom |
| avatar_emoji | VARCHAR(10) | 头像 emoji |
| last_message | TEXT | 最后一条消息内容 |
| last_message_at | TIMESTAMP | 最后消息时间 |
| created_at | TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 更新时间 |
#### 消息表 (messages)
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | VARCHAR(32) | 主键,如 msg_xxxxx |
| conversation_id | VARCHAR(32) | 对话 ID外键 |
| sender_type | ENUM | 发送者user/ai |
| content_type | ENUM | 内容类型text/image/audio |
| content | TEXT | 消息内容或资源 URL |
| metadata | JSON | 扩展数据(图片尺寸、音频时长等)|
| created_at | TIMESTAMP | 创建时间 |
#### 回忆录表 (memoirs)
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | VARCHAR(32) | 主键,如 memoir_xxxxx |
| user_id | VARCHAR(32) | 用户 ID外键唯一 |
| title | VARCHAR(100) | 书名 |
| subtitle | VARCHAR(200) | 副标题 |
| word_count | INT | 总字数 |
| created_at | TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 更新时间 |
#### 章节表 (memoir_chapters)
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | VARCHAR(32) | 主键,如 chapter_xxxxx |
| memoir_id | VARCHAR(32) | 回忆录 ID外键 |
| number | INT | 章节序号 |
| title | VARCHAR(100) | 章节标题 |
| content | TEXT | 章节内容Markdown |
| status | ENUM | 状态pending/partial/complete |
| word_count | INT | 字数 |
| created_at | TIMESTAMP | 创建时间 |
| updated_at | TIMESTAMP | 更新时间 |
#### 章节资源表 (chapter_assets)
| 字段 | 类型 | 说明 |
|-----|------|------|
| id | VARCHAR(32) | 主键 |
| chapter_id | VARCHAR(32) | 章节 ID外键 |
| type | ENUM | 类型image/audio |
| url | VARCHAR(500) | 资源 URL |
| caption | VARCHAR(200) | 说明文字 |
| position | INT | 在内容中的位置 |
| created_at | TIMESTAMP | 创建时间 |
---
## 5. AI 服务设计
### 5.1 语音识别服务ASR
#### 5.1.1 功能说明
将用户上传的语音消息转写为文字,供 AI 对话使用。
#### 5.1.2 技术选型
| 服务商 | 优势 | 说明 |
|-------|------|------|
| 阿里云 ASR | 中文识别准确率高 | 推荐 |
| 腾讯云 ASR | 价格较低 | 备选 |
| Whisper API | 多语言支持好 | 可选 |
#### 5.1.3 处理流程
```
1. 接收音频文件M4A/AAC 格式)
2. 调用 ASR 服务进行转写
3. 返回转写文本
4. 文本用于 AI 对话上下文
```
#### 5.1.4 性能要求
- 转写延迟:< 3秒60秒内音频
- 识别准确率:> 95%(普通话)
- 支持方言识别(可选增强)
---
### 5.2 对话 AI
#### 5.2.1 系统提示词设计
```markdown
你是一位温和、有耐心的回忆录采访助手。你的任务是通过对话帮助用户回忆和讲述他们的人生故事。
## 角色特点
- 像一位老朋友一样亲切
- 善于倾听和共情
- 会适时提出引导性问题
- 帮助用户回忆细节
## 对话原则
1. 每次回复要简短1-3句话
2. 多用鼓励和肯定的语气
3. 提问要具体,避免开放性太强
4. 关注时间、地点、人物、感受
5. 适当使用 emoji 增加亲切感
## 引导方向
- 童年与家庭
- 求学经历
- 工作与事业
- 爱情与婚姻
- 重要人生节点
- 难忘的经历
## 注意事项
- 不要一次问太多问题
- 如果用户情绪低落,给予安慰
- 尊重用户的隐私边界
- 语音消息转写可能有错别字,根据上下文理解用户意图
```
#### 5.2.2 技术选型
| 服务商 | 模型 | 说明 |
|-------|------|------|
| OpenAI | GPT-4o / GPT-4o-mini | 效果好,成本适中 |
| Claude | Claude 3.5 Sonnet | 对话质量高 |
| 智谱 AI | GLM-4 | 中文优化,国内访问快 |
| 阿里云 | 通义千问 | 国内合规,价格低 |
#### 5.2.3 上下文管理
- 保留最近 20 轮对话作为上下文
- 维护用户画像摘要(年龄、家庭背景等)
- 追踪已覆盖的话题,避免重复
### 5.3 回忆录生成 AI
#### 5.2.1 触发条件
- 用户发送消息后异步触发
- 或定时任务(每日)检查更新
#### 5.2.2 处理流程
```
1. 提取新对话内容
2. 分析内容主题
3. 匹配/创建对应章节
4. 将对话内容转化为叙述文字
5. 合并到章节内容中
6. 更新章节状态
```
#### 5.2.3 内容转化提示词
```markdown
将以下对话内容转化为回忆录章节的叙述性文字。
要求:
1. 使用第一人称
2. 保持自然流畅的叙事风格
3. 保留重要细节和情感
4. 适当引用原话作为点缀
5. 按时间或逻辑顺序组织内容
对话内容:
{对话记录}
当前章节已有内容:
{已有内容}
请输出应追加到该章节的新内容:
```
---
## 6. 服务端要求
### 6.1 性能要求
| 指标 | 要求 |
|-----|------|
| API 响应时间 (P95) | < 500ms |
| AI 回复时间 | < 3s首字|
| 并发用户数 | 1000 |
| 消息吞吐量 | 100 msg/s |
### 6.2 可靠性要求
| 指标 | 要求 |
|-----|------|
| 服务可用性 | 99.9% |
| 数据持久性 | 99.999999% |
| 故障恢复时间 | < 5min |
### 6.3 安全要求
- 传输加密TLS 1.2+
- 数据加密:敏感数据 AES-256 加密存储
- 认证JWT + 刷新令牌机制
- 授权RBAC 权限控制
- 审计:关键操作日志记录
### 6.4 合规要求
- 用户数据隔离
- 数据导出能力
- 账号注销与数据删除
- 隐私政策声明
---
## 7. V1 实现范围
### 核心功能 ✅
- [x] 用户基础信息 API
- [x] 对话列表与详情 API
- [x] 文字消息发送与 AI 回复
- [x] 语音消息上传与转写ASR
- [x] 语音消息 AI 回复
- [x] 回忆录章节 API
- [x] LLM 对话能力(真实 AI
### 简化实现V1
- [ ] 用户认证:允许匿名访问,通过设备 ID 识别
- [ ] 回忆录生成:使用定时任务而非实时生成
### 后续版本功能
- [ ] 手机号注册登录
- [ ] 图片消息上传与 AI 理解
- [ ] PDF 导出
- [ ] 付费套餐
- [ ] 流式 AI 回复
---
## 8. 后续迭代方向
### V1.1 功能增强
- 图片消息支持(上传 + AI 理解)
- 流式 AI 回复SSE
- 实时回忆录生成
### V1.2 多 Agent 支持
- 支持创建多个对话
- 不同类型的 AI 助手:
- 回忆录助手(默认)
- 故事整理助手
- 照片回忆助手
- 对话管理 API删除、归档
### V1.3 用户体系
- 手机号注册登录
- 微信登录
- 套餐与付费
### V2.0 完整功能
- PDF/打印导出
- 家庭成员协作
- 回忆录分享
- 多语言支持
- 方言语音识别