# Context Management Commands

## 问题背景

随着对话持续，Slack Bot 的上下文会不断增长，可能导致：
- Token 超过 LLM 限制
- Gemini API 返回空响应
- 响应速度变慢
- 成本增加

## 解决方案

新增两个 Slack 命令用于管理对话上下文：

### 1. `/clear` 或 `/reset` - 清空对话历史

**功能**: 清空当前频道的所有对话历史，重新开始新对话。

**使用场景**:
- 对话过长，Bot 返回空响应
- 切换话题，需要全新上下文
- 定期清理以保持性能

**用法**:
```
/clear
```
或
```
/reset
```

**返回示例**:
```
✅ 对话历史已清空,我们重新开始!

Context cleared (35 messages removed). Starting fresh conversation.
```

---

### 2. `/stats` - 查看上下文统计

**功能**: 显示当前频道的上下文大小和 token 预估。

**使用场景**:
- 检查上下文是否过大
- 决定是否需要清理
- 监控性能优化效果

**用法**:
```
/stats
```

**返回示例**:
```
📊 对话上下文统计 (Context Stats)

• 消息数量 (Messages): 35
• 总字符数 (Total chars): 12,456
• 预估 Token (Est. tokens): ~4,152

使用 `/clear` 可以清空对话历史
```

---

## Token 估算规则

- **中英文混合文本**: 1 token ≈ 3 characters
- **纯英文文本**: 1 token ≈ 4 characters
- **纯中文文本**: 1 token ≈ 2 characters

**推荐阈值**:
- ⚠️ **警告**: Token > 8,000 (建议清理)
- 🚨 **危险**: Token > 15,000 (可能触发空响应)

---

## 技术实现

### 配置参数

在 `slack_bot/context/storage.py` 中:
```python
MAX_MESSAGES = 40  # 保留最近 40 条消息
```

### 自动滑动窗口

当消息数超过 `MAX_MESSAGES` 时，会自动保留最新的消息:
```python
if len(context) > self.MAX_MESSAGES:
    context = context[-self.MAX_MESSAGES:]  # 保留最后 40 条
```

---

## 最佳实践

### 1. 定期清理
建议每隔 **30-50 条对话**后手动清理一次。

### 2. 长对话前检查
在开始复杂分析或长时间咨询前，先运行 `/stats` 检查上下文大小。

### 3. 话题切换时清理
从健康数据查询切换到食物记录时，可以清理上下文以获得更好的专注度。

### 4. 遇到空响应时
如果 Gemini 返回空响应：
1. 运行 `/stats` 查看 token 大小
2. 如果 > 8,000 tokens，立即运行 `/clear`
3. 重新发送原始问题

---

## 日志监控

系统会自动记录清理操作：
```log
2026-02-05 20:51:13 - __main__ - INFO - ✅ Context cleared for channel D0AA4GBQRKK (removed 35 messages)
```

可以通过查看日志追踪上下文管理情况：
```bash
tail -f logs/slack_bot.log | grep "Context cleared"
```

---

## 未来优化 (Roadmap)

- [ ] **自动压缩**: 智能保留重要消息（工具调用、数据查询结果）
- [ ] **分层存储**: 将旧消息移至摘要层
- [ ] **自动提醒**: 当 token > 8,000 时自动提示用户清理
- [ ] **Per-Channel 配置**: 不同频道使用不同的上下文大小限制

---

## 故障排查

### 问题: `/clear` 命令无效

**可能原因**:
1. 命令格式错误（必须单独一行，不能有其他文字）
2. Bot 未正确启动

**解决方法**:
```bash
# 检查 Bot 日志
tail -f logs/slack_bot.log

# 重启 Bot
supervisorctl restart slack_bot
```

### 问题: `/stats` 显示 token 为 0

**可能原因**: 上下文文件不存在或已损坏

**解决方法**:
```bash
# 检查上下文文件
ls -lh data/slack_context/
```

---

## 相关文件

- **实现**: `slack_bot/main.py` (L51-112)
- **存储**: `slack_bot/context/storage.py`
- **测试**: `tests/test_context_commands.py`
