在长期使用 AI Agent 或本地对话系统时,Session 数量很快会增加。如果系统默认使用第一条消息、内容摘要或者自动生成的标题作为对话名称,侧边栏最终可能变成这样:
检查一下这个服务为什么启动失败……
帮忙分析一下当前数据库……
新Session启动有点慢……
这种方式短期看很直观,但长期使用会出现几个问题:
- 对话名称不可预测;
- 第一条消息可能暴露不希望显示在列表里的内容;
- 标题长度不统一;
- 很难根据时间快速定位会话;
- 自动生成标题可能发生变化;
- 多台终端创建 Session 时不容易建立统一规则。
一种简单稳定的方案是:
每次创建新 Session 时,直接使用创建时间作为 Session 名称。
例如:
20260920-090436
20260920-095635
20260921-173022
一、为什么使用时间戳
推荐格式:
YYYYMMDD-HHMMSS
例如:
20260920-090436
表示:
2026-09-20 09:04:36
这种格式有几个明显优势。
首先,名称完全可预测。
任何 Session 都使用相同格式,不需要 AI 自动生成标题,也不依赖聊天内容。
其次,它天然可以排序。
20260920-090436
20260920-095635
20260920-143205
文件系统式的字典顺序与时间顺序基本一致。
第三,它减少了信息暴露。
Session 列表只显示:
20260920-090436
而不是:
服务器密码配置为什么失败
对于长期运行、Web 管理界面经常打开的 Agent 来说,这一点尤其有价值。
二、Session ID 和显示名称不是同一个东西
很多对话系统内部会同时存在两层标识:
Session key / Session ID
显示名称 / Label
例如内部可能是:
agent:main:20260920-090436
而界面显示:
20260920-090436
因此,一个完整的时间戳 Session 方案最好同时处理:
- 创建 Session 时使用时间戳作为 Session key;
- 同时把 Session label 设置为相同时间戳。
这样数据库、CLI 和 Web UI 看到的是同一套命名逻辑。
三、为什么不要在进入对话后再手动 /name
一种最直观的做法是:
启动 Session
↓
进入 TUI
↓
执行 /name 20260920-090436
这种方案能工作,但并不理想。
因为 /name 本身也是一次对话操作。
它可能:
- 进入聊天记录;
- 形成额外事件;
- 污染原本应该干净的 Session;
- 在某些界面中产生不必要的显示记录。
更好的方式是:
在 TUI 启动之前,直接修改 Session metadata。
也就是:
生成时间戳
↓
建立/更新 Session metadata
↓
设置 label
↓
启动 TUI
这样时间戳只是 Session 元数据,不属于聊天正文。
四、使用 Session patch 设置 Label
假设 OpenClaw Gateway 提供 Session patch 接口,可以先生成时间戳:
session="$(date +%Y%m%d-%H%M%S)"
然后生成完整 Session key:
key="agent:main:$session"
通过 Gateway 修改 Session label:
openclaw gateway call sessions.patch \
--params "{\"key\":\"$key\",\"label\":\"$session\"}"
最后启动 TUI:
openclaw tui --session "$session"
最终效果类似:
agent main | session 20260920-090436
Web 侧边栏则只需要显示:
20260920-090436
五、封装成一个 oc 命令
每次手工输入这些命令没有必要。
可以直接封装为 shell function:
oc() {
local session key
session="$(date +%Y%m%d-%H%M%S)"
key="agent:main:$session"
openclaw gateway call sessions.patch \
--params "{\"key\":\"$key\",\"label\":\"$session\"}" \
>/dev/null 2>&1 &&
openclaw tui --session "$session"
}
以后启动新对话只需要:
oc
例如在:
09:04:36
执行:
oc
自动创建:
20260920-090436
下一次:
09:56:35
执行:
oc
创建:
20260920-095635
完全不需要人工命名。
六、为什么本地版本不应该使用 exec
有一个很容易忽略的细节。
如果函数写成:
exec openclaw tui --session "$session"
那么当前 shell 会被 TUI 进程直接替换。
结果就是:
进入 TUI
↓
输入 /exit
↓
整个 shell 结束
如果希望退出 TUI 后仍然回到原来的终端,应当使用:
openclaw tui --session "$session"
而不是:
exec openclaw tui --session "$session"
因此本地主机上的推荐写法是:
oc() {
local session key
session="$(date +%Y%m%d-%H%M%S)"
key="agent:main:$session"
openclaw gateway call sessions.patch \
--params "{\"key\":\"$key\",\"label\":\"$session\"}" \
>/dev/null 2>&1 &&
openclaw tui --session "$session"
}
七、远程 SSH 启动时可以使用 exec
如果工作站通过 SSH 连接到真正运行 Gateway 的服务器,则情况不同。
例如:
oc() {
ssh -t user@example-host '
session="$(date +%Y%m%d-%H%M%S)"
key="agent:main:$session"
openclaw gateway call sessions.patch \
--params "{\"key\":\"$key\",\"label\":\"$session\"}" \
>/dev/null 2>&1 &&
exec openclaw tui --session "$session"
'
}
这里使用:
exec openclaw tui
反而是合理的。
因为被替换的是远程 SSH shell。
退出 TUI 后:
远程进程结束
↓
SSH 连接结束
↓
回到本地终端
不会关闭本地 shell。
因此可以总结为:
本地主机:
openclaw tui ...
远程 SSH:
exec openclaw tui ...
八、时间应该在哪台机器生成
如果多个工作站都连接同一个 OpenClaw Gateway,最好在 Gateway 所在服务器生成时间戳。
不要在客户端先生成:
session="$(date ...)"
ssh server ...
更推荐:
ssh server '
session="$(date +%Y%m%d-%H%M%S)"
...
'
这样无论从哪台客户端连接:
Linux 工作站
笔记本
远程终端
手机 SSH
Session 时间统一采用服务器时钟。
避免不同客户端存在:
- 时区不同;
- NTP 状态不同;
- 时间误差;
- DST 配置差异。
九、时间戳命名最大的价值不是“好看”
这种方案真正解决的是 Session 管理的一致性。
传统方式:
检查数据库
服务器配置
新Session启动有点慢
帮我分析这个问题
Untitled
New Session
时间戳方式:
20260919-172038
20260919-182655
20260919-211336
20260920-090436
20260920-095635
20260920-135516
从列表本身就能直接看出:
- 哪个 Session 最早;
- 哪个 Session 最新;
- 一天创建了多少 Session;
- 两个 Session 相隔多久;
- 某次系统操作大概对应哪个会话。
甚至系统日志出现:
2026-09-20 09:57
时,也能迅速关联到:
20260920-095635
这比自动生成的自然语言标题更适合系统管理。
十、它也是一种隐私设计
Session 名称经常被低估。
实际上,标题本身也可能泄露大量信息。
例如:
分析工资收入
检查私人服务器
数据库恢复记录
家庭财务规划
即使没有打开聊天正文,只要有人看到侧边栏,就已经知道很多内容。
而时间戳:
20260920-095635
几乎不暴露主题。
因此时间戳命名实际上遵循了一个很简单的原则:
列表只承担索引功能,不承担内容摘要功能。
内容应该存在于 Session 内部,而不是暴露在导航界面中。
十一、一个适合长期使用的最终方案
本地服务器:
oc() {
local session key
session="$(date +%Y%m%d-%H%M%S)"
key="agent:main:$session"
openclaw gateway call sessions.patch \
--params "{\"key\":\"$key\",\"label\":\"$session\"}" \
>/dev/null 2>&1 &&
openclaw tui --session "$session"
}
远程客户端:
oc() {
ssh -t user@example-host '
session="$(date +%Y%m%d-%H%M%S)"
key="agent:main:$session"
openclaw gateway call sessions.patch \
--params "{\"key\":\"$key\",\"label\":\"$session\"}" \
>/dev/null 2>&1 &&
exec openclaw tui --session "$session"
'
}
最终形成统一规则:
Session key:
agent:main:YYYYMMDD-HHMMSS
Session label:
YYYYMMDD-HHMMSS
Web UI:
YYYYMMDD-HHMMSS
Session 命名从此不再依赖聊天内容、不需要人工输入、不污染聊天记录,也不暴露首条消息。
对于长期运行的个人 AI Agent 来说,这种方案简单,但非常适合持续使用。