# 🎯 AI Agent 新功能说明
## 新增功能概览
本次更新实现了三大核心功能:**用户登录隔离**、**对话历史管理**、**流式实时响应**。
---
## 一、用户登录系统
### 功能特性
- ✅ **可选登录**:用户可以选择输入用户名或直接使用默认用户
- ✅ **对话隔离**:不同用户的对话历史完全隔离,避免污染
- ✅ **默认用户**:未登录时使用 `default_user`,所有未登录用户共享对话
### 使用方式
1. 启动前端后,左侧栏显示登录界面
2. 输入用户名(可选),点击"进入"
3. 如需切换用户,点击"切换用户"按钮
### 技术实现
- 前端:`st.session_state.user_id` 和 `st.session_state.logged_in` 管理登录状态
- 后端:所有 API 请求携带 `user_id` 参数,用于数据隔离
- 数据库:LangGraph checkpoint 的 `metadata` 字段存储 `user_id`
---
## 二、对话历史管理
### 功能特性
- ✅ **历史列表**:左侧栏显示用户的所有对话历史
- ✅ **摘要展示**:每个历史对话显示摘要(第一条消息或生成的 summary)
- ✅ **一键加载**:点击历史对话,自动加载完整消息历史
- ✅ **新对话**:点击"新对话"按钮创建全新对话线程
- ✅ **实时更新**:每次对话结束后自动刷新历史列表
### 使用方式
1. 点击"刷新列表"按钮加载历史对话
2. 点击任意历史对话,自动加载完整消息历史
3. 点击"新对话"开始全新话题
### 技术实现
#### 后端新增接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/threads` | GET | 获取用户的对话历史列表 |
| `/thread/{thread_id}/messages` | GET | 获取指定线程的完整消息历史 |
| `/thread/{thread_id}/summary` | GET | 获取指定线程的摘要信息 |
#### 新增模块
- `app/history.py`: `ThreadHistoryService` 类,封装历史查询逻辑
- 直接查询 LangGraph 的 `checkpoints` 表,通过 `metadata->>'user_id'` 过滤
#### 前端实现
- 左侧栏显示历史列表,每个对话显示摘要、时间和消息数量
- 当前选中的对话高亮显示(primary 按钮样式)
- 点击历史对话调用 `/thread/{thread_id}/messages` 加载完整历史
---
## 三、流式实时响应
### 功能特性
- ✅ **逐字输出**:AI 回复实时逐字显示,提升用户体验
- ✅ **工具调用状态**:显示工具调用的开始和完成状态
- ✅ **Token 统计**:对话结束后显示消耗的 token 数量和耗时
- ✅ **错误处理**:流式响应异常时友好提示用户
### 使用方式
- 在输入框输入问题后,AI 回复会逐字显示,无需等待完整响应
- 如果 AI 调用工具,会显示"🔧 调用工具: xxx..."的提示
- 工具调用完成后显示"✅ 工具 xxx 完成"
- 回复完成后显示 token 消耗和耗时统计
### 技术实现
#### 后端流式接口
| 接口 | 方法 | 说明 |
|------|------|------|
| `/chat/stream` | POST | 流式对话接口(SSE) |
#### SSE 事件类型
```json
{
"type": "token", // AI 逐字输出
"content": "你好"
}
{
"type": "tool_start", // 工具调用开始
"tool": "search_calendar"
}
{
"type": "tool_end", // 工具调用完成
"tool": "search_calendar"
}
{
"type": "done", // 对话完成
"reply": "完整回复内容",
"token_usage": {"total_tokens": 123},
"elapsed_time": 2.5
}
{
"type": "error", // 错误信息
"message": "错误详情"
}
```
#### Agent 流式处理
- `AIAgentService.process_message_stream()` 方法
- 使用 LangGraph 的 `astream_events()` API 获取流式事件
- 支持所有模型(zhipu, deepseek, local)
#### 前端流式消费
- 使用 `requests.post(..., stream=True)` 消费 SSE 流
- 逐行解析 `data: {...}` 格式的事件
- 实时更新 UI 显示 token 和工具状态
---
## 四、三栏布局设计
### 布局结构
```
┌──────────────┬──────────────────────────┬──────────────┐
│ 左侧栏 (1) │ 中间栏 (3) │ 右侧栏 (1) │
│ │ │ │
│ 👤 用户 │ 🤖 AI 个人助手 │ 📊 会话信息 │
│ [登录] │ │ │
│ │ [模型选择器] │ 当前对话 │
│ 📚 历史 │ ┌────────────────────┐ │ xxx... │
│ [刷新] │ │ │ │ │
│ [新对话] │ │ 聊天消息区域 │ │ 消息统计 │
│ │ │ │ │ 用户: 5 │
│ 💬 对话1 │ └────────────────────┘ │ AI: 4 │
│ 💬 对话2 │ │ │
│ 💬 对话3 │ [输入框] │ 💡 使用提示 │
│ │ │ │
└──────────────┴──────────────────────────┴──────────────┘
```
### 各栏功能
#### 左侧栏(宽度 1/5)
- **用户登录**:输入用户名,切换用户
- **历史列表**:刷新、点击加载、新对话按钮
#### 中间栏(宽度 3/5)
- **模型选择**:下拉框选择 AI 模型
- **聊天区域**:显示消息历史,支持流式输出
- **输入框**:输入用户问题
#### 右侧栏(宽度 1/5)
- **会话信息**:显示当前线程 ID
- **消息统计**:用户消息和 AI 回复数量
- **使用提示**:功能说明
---
## 五、配置说明
### 环境变量
#### 本地开发(.env)
```bash
# API 地址(注意:不需要 /chat 后缀)
API_URL=http://localhost:8083
# 日志调试配置(本地开发推荐 DEBUG)
LOG_LEVEL=DEBUG
DEBUG=true
ENABLE_GRAPH_TRACE=true
```
#### Docker 部署(.env.docker)
```bash
# API 地址(Docker 内部网络)
API_URL=http://backend:8083
# 日志调试配置(生产环境推荐 WARNING)
LOG_LEVEL=WARNING
DEBUG=false
ENABLE_GRAPH_TRACE=false
```
### 端口分配
| 服务 | 端口 | 说明 |
|------|------|------|
| llama.cpp LLM | 8081 | Gemma-4-E2B GGUF 模型 |
| llama.cpp Embedding | 8082 | embeddinggemma-300M GGUF 模型 |
| Backend (FastAPI) | 8083 | AI Agent 后端服务 |
| Frontend (Streamlit) | 8501 | Web 界面 |
---
## 六、文件变更清单
### 新增文件
| 文件 | 说明 |
|------|------|
| `app/history.py` | 历史查询服务 `ThreadHistoryService` |
### 修改文件
| 文件 | 修改内容 |
|------|---------|
| `app/agent.py` | • 添加 `process_message_stream()` 流式处理方法
• `process_message()` 写入 `metadata` 支持历史查询 |
| `app/backend.py` | • 添加 `/threads`、`/thread/{id}/messages`、`/thread/{id}/summary` 接口
• 添加 `/chat/stream` 流式接口
• 注入 `history_service` |
| `frontend/frontend.py` | • 完全重写为三栏布局
• 实现用户登录和历史管理
• 支持流式响应消费 |
| `.env`, `.env.docker`, `.env.example` | • 移除 `API_URL` 中的 `/chat` 后缀 |
---
## 七、使用示例
### 1. 本地开发启动
```bash
# 启动后端和前端
./scripts/start.sh both
# 访问前端
open http://localhost:8501
```
### 2. Docker 部署
```bash
# 配置环境变量
cp .env.docker .env
# 编辑 .env 填入 API Key
# 启动服务
cd docker
docker compose up -d
```
### 3. API 测试
```bash
# 获取历史列表
curl "http://localhost:8083/threads?user_id=test_user"
# 获取线程消息
curl "http://localhost:8083/thread/{thread_id}/messages?user_id=test_user"
# 流式对话
curl -X POST "http://localhost:8083/chat/stream" \
-H "Content-Type: application/json" \
-d '{
"message": "你好",
"thread_id": "test-thread",
"model": "zhipu",
"user_id": "test_user"
}'
```
---
## 八、注意事项
### 1. 数据库查询性能
- 当前直接查询 `checkpoints` 表的 JSONB `metadata` 字段
- 如果用户对话数量很大,建议在 `checkpoints` 表上创建 GIN 索引:
```sql
CREATE INDEX idx_checkpoints_metadata_user_id
ON checkpoints USING GIN ((metadata->>'user_id'));
```
### 2. 流式响应缓冲
- 如果使用 Nginx 反向代理,需要关闭缓冲:
```nginx
location /chat/stream {
proxy_pass http://backend:8083;
proxy_buffering off;
proxy_cache off;
}
```
### 3. 历史列表分页
- 当前默认返回 50 条历史记录
- 如需支持更多历史,可在 `/threads` 接口添加 `offset` 参数实现分页
### 4. 用户认证增强
- 当前用户登录仅为前端输入,无密码验证
- 如需加强安全性,可集成 OAuth2 或 JWT 认证
---
## 九、下一步优化建议
1. **对话摘要生成**:在 `summarize` 节点中生成对话摘要,存入 checkpoint metadata
2. **历史记录搜索**:添加关键词搜索功能,快速定位历史对话
3. **对话导出**:支持导出对话历史为 Markdown 或 JSON 格式
4. **多设备同步**:同一用户的不同设备共享对话历史
5. **对话标签**:支持为对话添加标签和分类
6. **收藏功能**:支持收藏重要对话,方便快速访问
---
**🎉 新功能已全部实现并测试通过!**