# 会话与记忆 ## 会话 ### 会话如何工作 与代理的每次对话都在一个**会话**中进行。会话通过编码上下文的键来标识 -- 哪个代理、哪个频道、哪个聊天。 会话维护所有消息、工具调用和结果的完整记录(仅追加的 JSONL)。这个记录为代理提供了关于正在进行的对话的上下文。 ### 会话键 会话根据上下文自动路由: | 模式 | 含义 | |---------|---------| | `agent:main:main` | 主直接对话 | | `agent:::group:` | 特定频道上的群聊 | | `agent:::channel:` | 频道/房间对话 | | `cron:` | 计划任务执行 | | `hook:` | Webhook 触发的执行 | ### 会话生命周期 - **每日重置** -- 会话在可配置的时间自动重置(默认本地时间凌晨 4 点)。这每天创建一个新的对话上下文,同时保留历史。 - **空闲过期** -- 在可配置期间内未活跃的会话可以自动重置。 - **手动重置** -- 随时使用 `/new` 或 `/reset` 命令重新开始。 ### Token 跟踪 会话跟踪累计 token 使用量(输入、输出、缓存读取、缓存写入),用于成本监控和上下文窗口管理。 --- ## 压缩 ### 什么是压缩? 当对话接近模型的上下文窗口限制时,Neotask 会**压缩**它 -- 将旧消息总结为精简概述,并以该总结加上最近消息开始新会话。 ### 工作原理 1. **检测** -- 监控上下文使用量(默认触发:上下文窗口的 80%) 2. **总结** -- 旧消息被总结为压缩条目 3. **新会话** -- 新会话开始,总结注入顶部 4. **保留** -- 旧记录保留用于历史,但不再加载到上下文中 ### 配置 - **启用/禁用** -- 切换自动压缩 - **阈值** -- 触发压缩的上下文窗口百分比(默认 80%) - **最小消息数** -- 消息少于 N 条时不压缩 ### 手动压缩 您可以随时使用 `/compact` 命令手动触发压缩。当您想重置上下文而不丢失重要信息时非常有用。 --- ## 记忆 ### 代理记忆 每个代理都有一个记忆系统,用于跨会话持久保存重要信息: - **MEMORY.md** -- 代理工作空间中的 markdown 文件,存储重要事实、偏好和上下文 - **记忆目录** -- `memory/` 中用于结构化知识的额外文件 ### 向量搜索 Neotask 支持对代理记忆的向量相似性搜索: 1. **索引** -- 使用嵌入对记忆文件进行索引 2. **搜索** -- 代理使用自然语言查询记忆("用户说过关于 API 偏好的什么?") 3. **召回** -- 相关记忆按相似度排名返回 ### 记忆插件(LanceDB) LanceDB 记忆插件提供高级向量存储: - 持久向量数据库 - 可配置的块大小和重叠 - 高效的相似性搜索 - 记忆文件更改时自动重新索引 ### 自动召回 在会话开始时,相关记忆可以自动召回并注入代理的上下文。这为代理提供了跨会话的连续性,而无需加载整个对话历史。 --- ## 会话持久化 所有会话数据本地存储: - **会话元数据** -- `sessions.json` 跟踪活跃会话、最后活动、token 计数和配置 - **记录** -- 单独的会话记录存储为 `.jsonl` 文件 - **恢复** -- 会话在 Gateway 重启后不会丢失数据 ### 清理 - 在可配置期间(默认 30 天)内未访问的会话有资格被清理 - 通过 UI 或 API 提供手动会话管理 - 压缩的记录被存档但可以查看