什么是Session?
用户:"帮我查一下北京天气"
Agent:"北京今天晴,25度"
用户:"那上海呢?"
Agent:???
如果没有Session,Agent不知道"那上海呢"指的是天气。有了Session,Agent能记住上下文,理解"那上海呢"是问上海的天气。这就是Session的价值:让Agent拥有对话记忆。
💡 核心概念:Session是一个完整的对话上下文容器,包括消息历史、用户状态、执行进度等。它让Agent从"一次性工具"进化成"长期伙伴"。
Session结构
核心组成
interface Session {
id: string; // Session唯一标识
userId: string; // 用户ID
messages: Message[]; // 消息历史
context: SessionContext; // 会话上下文
state: SessionState; // 会话状态
metadata: SessionMetadata; // 元数据
createdAt: Date; // 创建时间
updatedAt: Date; // 更新时间
}
interface Message {
id: string;
role: 'user' | 'assistant' | 'system' | 'tool';
content: string;
timestamp: Date;
metadata?: Record;
}
interface SessionContext {
userPreferences?: any; // 用户偏好
activeTools?: string[]; // 当前激活的工具
taskProgress?: any; // 任务进度
customData?: any; // 自定义数据
}
Session生命周期
创建与管理
import { SessionManager } from 'openclaw';
const sessionManager = new SessionManager({
storage: 'redis', // 或 'memory', 'file', 'database'
ttl: 86400, // Session存活24小时
maxSessions: 1000 // 每用户最多1000个Session
});
// 创建新Session
const session = await sessionManager.create({
userId: 'user_123',
context: {
userPreferences: { language: 'zh-CN' }
}
});
// 获取现有Session
const existingSession = await sessionManager.get('session_id');
// 恢复Session(从存储中加载)
const recovered = await sessionManager.recover('session_id');
// 销毁Session
await sessionManager.destroy('session_id');
多轮对话实现
消息追加与上下文构建
// 用户发送消息
session.addMessage({
role: 'user',
content: '帮我查一下北京天气'
});
// Agent处理并回复
const response = await agent.process(session);
session.addMessage({
role: 'assistant',
content: response.content
});
// 下一轮对话时,Session自动带上历史
session.addMessage({
role: 'user',
content: '那上海呢?'
});
// Agent能看到完整历史,理解"那上海呢"
const response2 = await agent.process(session);
上下文窗口管理
⚠️ 注意:消息历史不能无限增长,需要控制上下文窗口大小。GPT-4最大128K tokens,Claude最大200K,但实际建议控制在模型最优范围内。
session.setContextWindow({
maxTokens: 40000, // 最大40K tokens
// 消息裁剪策略
pruningStrategy: 'sliding_window',
// 保留最近N条消息
keepRecentMessages: 20,
// 或使用摘要策略
// pruningStrategy: 'summary',
// 当历史过长时,用LLM生成摘要替换旧消息
// 系统消息始终保留
keepSystemMessages: true
});
Session持久化
存储选项
| 存储类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 内存 | 速度快、无依赖 | 重启丢失、容量有限 | 开发测试 |
| Redis | 快速、分布式、持久化 | 需要Redis服务 | 生产环境推荐 |
| 数据库 | 可靠、可查询、可分析 | 速度较慢 | 需要数据分析 |
| 文件 | 简单、无依赖 | 性能差、并发问题 | 单机小规模 |
Redis存储配置
const sessionManager = new SessionManager({
storage: 'redis',
redis: {
host: 'localhost',
port: 6379,
password: process.env.REDIS_PASSWORD,
db: 0,
keyPrefix: 'session:'
},
// 自动保存
autoSave: true,
saveInterval: 5000, // 每5秒保存
// 加载时的钩子
onLoad: async (session) => {
// 检查Session是否过期
if (session.isExpired()) {
throw new Error('Session已过期');
}
return session;
}
});
用户隔离
多用户Session管理
// 用户隔离策略
sessionManager.setUserIsolation({
enabled: true,
// 用户无法访问其他用户的Session
strict: true,
// 每用户Session数量限制
maxSessionsPerUser: 10,
// 用户切换时自动清理
onUserSwitch: async (oldUser, newUser) => {
// 清理旧用户的临时数据
await cleanupUserTempData(oldUser);
}
});
Session恢复
断点续传
当用户中断或系统崩溃时,Session可以恢复到之前的状态:
session.enableRecovery({
// 自动保存执行状态
saveCheckpoint: true,
checkpointInterval: 10000, // 每10秒
// 恢复时的处理
onRecover: async (session, checkpoint) => {
// 检查是否有进行中的任务
if (checkpoint.activeTask) {
// 询问用户是否继续
return await askUserContinue(checkpoint.activeTask);
}
return session;
}
});
跨设备同步
// 用户在不同设备上继续对话
session.enableSync({
// 实时同步到其他设备
realtime: true,
// 同步冲突处理
conflictResolution: 'latest', // 或 'merge'
// 同步通知
onSync: async (session, source) => {
notifyUser(`对话已在${source}设备更新`);
}
});
高级特性
Session分支
// 创建Session分支(用于探索不同对话路径)
const branch = session.branch({
name: '探索路径A',
fromMessage: 'message_id_5' // 从第5条消息开始分支
});
// 在分支上继续对话
branch.addMessage({ role: 'user', content: '换个方案试试' });
// 可以随时切换回主Session
session.switchTo('main');
Session分享
// 生成分享链接(匿名用户可查看)
const shareLink = session.share({
permissions: ['read'], // 只读权限
expiresIn: 3600, // 1小时后失效
includeMessages: true // 包含消息历史
});
// 其他用户访问分享的Session
const sharedSession = await sessionManager.accessShared(shareToken);
最佳实践
- ✅ 使用Redis存储Session(生产环境)
- ✅ 设置合理的上下文窗口大小
- ✅ 实现Session自动过期清理
- ✅ 用户数据严格隔离
- ✅ 长对话使用摘要裁剪
- ✅ 关键任务启用checkpoint
- ✅ 监控Session创建和活跃数
常见问题
Q: Session和Memory有什么区别?
Session是短期对话记忆(本次聊天),Memory是长期知识记忆(用户偏好、历史事件)。两者互补。
Q: 多长的历史合适?
建议保留最近20-50条消息,约20K-40K tokens。具体根据模型和任务调整。
Q: 如何处理隐私问题?
敏感内容不存储到Session,或使用加密存储。用户可随时请求删除Session。