会话自动重置

长期运行的会话会积累消息历史。随着历史增长,prompt token 增多、上下文窗口被填满,每次请求的成本也随之上升。会话自动重置按计划清除历史,使 agent 在每个工作时间窗口都从干净的上下文开始,同时保留 agent 身份、配置和技能。

该功能面向无人值守部署——cron 驱动的 agent、常驻助手,以及多个用户共享同一个 agent 但彼此不应看到对方历史的多租户场景。

目录


配置

~/.librefang/config.toml 中添加 [session_reset] 段:

[session_reset]
# "off" | "idle" | "daily" | "both"
mode = "idle"

# Minutes of inactivity before the session is reset (used by "idle" and "both").
idle_minutes = 30

# UTC hour (0–23) at which the daily reset fires (used by "daily" and "both").
# The reset runs at the first check after this hour boundary.
daily_at_hour = 3

所有字段都有默认值——空的 [session_reset] 段是合法的,等同于 mode = "off"

字段默认值约束
mode"off""off""idle""daily""both"
idle_minutes3011440
daily_at_hour0023(UTC)

重置模式

模式行为
off关闭自动重置。会话持续存在,直到被显式关闭。
idleidle_minutes 分钟内未收到新消息时重置。每次新消息到达都会重置计时器。
daily每天 UTC daily_at_hour 时刻重置一次,与活动情况无关。
both任意一个条件触发即重置——以先到达的为准。

重置是按会话的,不是按 agent。一个 agent 同时运行多个会话(例如每个频道一个),每个会话独立计时。

重置触发后,消息历史被清空。下一条发给 agent 的消息将开启新对话,只包含系统提示词和注入的上下文(记忆、技能),不包含此前的交流记录。


暂停状态

除了自动重置,还可以通过 API 暂停会话:

# Suspend a session — queued messages will not be delivered until resumed
curl -X PATCH http://127.0.0.1:4545/api/agents/{agent_id}/sessions/{session_id} \
  -H "Content-Type: application/json" \
  -d '{"suspended": true}'

# Resume a suspended session
curl -X PATCH http://127.0.0.1:4545/api/agents/{agent_id}/sessions/{session_id} \
  -H "Content-Type: application/json" \
  -d '{"suspended": false}'
字段类型说明
suspendedbooleantrue 时,会话将到达的消息入队但不处理
resume_pendingboolean(只读)暂停期间有消息到达并等待投递时为 true

被暂停的会话不会被自动重置——空闲计时器和每日时钟仍在推进,但历史会保留到重置触发或你手动重置为止。这适合维护窗口:暂停以暂缓处理,执行外部操作,再恢复。

随时手动重置:

curl -X POST http://127.0.0.1:4545/api/agents/{agent_id}/sessions/{session_id}/reset

重置记录

每次重置(自动或手动)后,LibreFang 会在会话元数据中记录原因。reset_reason 字段会在 session:reset 事件钩子载荷以及会话详情 API 响应中暴露。

reset_reason触发条件
idle空闲超时到期
daily每日时钟边界跨越
suspended会话处于暂停状态时触发了重置
manual显式调用 POST /api/.../sessions/{id}/reset

可在监控钩子中使用该字段,区分常规计划重置与意外的人工干预。


使用场景

交互助手的空闲重置。 上班时间为员工答疑的 agent 会从数十次对话中积累历史。设置 mode = "idle"idle_minutes = 60 后,会话在静默一小时后清空——每次新对话开始时不再背负无关的历史。

cron 驱动 agent 的每日重置。 跑夜间数据处理任务的 agent 应每天从一个已知状态开始。mode = "daily" 配合 daily_at_hour = 2,会在第一次预定任务前的 02:00 UTC 重置会话,确保昨天的上下文不会渗入今天的运行。

高流量共享 agent 的双模式。 在繁忙团队频道里服务多个用户的 channel bot 适合 mode = "both":空闲重置应对安静时段,每日重置在频道持续活跃时充当兜底。


与 session_mode 的关系

session_resetsession_mode 是两个独立控制项,作用在不同层级。

设置位置控制内容
session_modeagent.toml(每 agent 清单)自动化调用是创建新会话还是复用持久会话
session_resetconfig.toml(全局)已有持久会话是否按计划清空历史

一个常见误解:在 agent 清单里设置 session_mode = "new"不会按计划清空历史——它只是为每次调用创建一个新的会话对象。原始的持久会话不受影响,会继续增长。

反之,session_reset 不会创建新的会话对象。它就地清空已有会话的消息历史。会话 ID 保持不变,只有对话轮次被移除。

对于需要每次触发完全隔离的 cron 任务,单靠任一设置都不够——应在 trigger 定义中使用 session_mode = "new"。对于需要在一天内保持连续、但每天早上从干净状态开始的 agent,session_reset 配合 mode = "daily" 才是正解。详见 session_mode 参考 的解析顺序与 cron 相关注意事项。