在长期使用 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 方案最好同时处理:

  1. 创建 Session 时使用时间戳作为 Session key;
  2. 同时把 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 来说,这种方案简单,但非常适合持续使用。

Leave a Reply

Your email address will not be published. Required fields are marked *