会话日志Skill:用 jq 与 rg 把历史对话变成可查询的数据资产
核心结论速览
- 它是什么:
session-logs(会话日志Skill)是一个面向 AI 助手自身会话记录的检索与分析技能,把存放在~/.otto/agents/<agentId>/sessions/下的 JSONL 对话文件,变成用jq和rg就能随时查询的结构化数据。 - 解决什么问题:当对话变长后被移出内存、或用户需要引用"上一次/父对话"里的内容时,模型容易"失忆";这个技能让助手能主动回到磁盘上的完整历史中去找原话。
- 怎么用:不需要写代码,用自然语言提出"帮我在上个会话里找关于 X 的讨论",助手就会组装出对应的
jq/rg命令执行并汇总结果。 - 技术门槛:只依赖两个命令行工具
jq与rg,无需数据库、无需服务端。 - 额外收益:内置成本统计、消息计数、工具调用分布等查询模板,可以用来复盘"我在 AI 上花了多少钱、都让它干了什么"。
该技能叫什么?如何一键安装 AI 技能提升开发效率?
基本信息
| 项目 | 内容 |
|---|---|
| 技能中文名 | 会话日志Skill |
| 技能英文名 | session-logs |
| 技能 ID | 13569 |
| 图标标识 | 📜 |
| 运行时依赖 | jq、rg(ripgrep)两个命令行二进制 |
它到底解决什么问题
在长期使用 AI 助手的过程中,会产生一条完整的时间线:每一次提问、每一次模型回复、每一次工具调用。但当单次上下文窗口被塞满、或者用户切换到新的会话继续讨论时,早期内容就被"移出内存"了。此时用户一句"我们上次说的那个接口方案是什么来着?“,模型往往只能回答"抱歉,我看不到之前的对话”。
会话日志Skill 的价值就在于:它知道历史对话被存到了磁盘的哪里、以什么格式存放、以及用什么命令能最快把想要的那几句原文捞出来。它不是一个"记忆增强插件",而是把"翻旧账"这件事变成了一条可复现的检索路径。
安装前的准备
根据技能元数据,本技能只需要两个可执行程序存在于系统 PATH 中:
jq—— 用于解析 JSONL 中的每一行 JSON 对象,做筛选、聚合、求和;rg(ripgrep)—— 用于在多个会话文件中快速做关键字全文搜索。
在 macOS / Linux 上通常通过各自的包管理器安装这两个工具;Windows 用户建议在 WSL 或 Git Bash 环境下使用。具体的安装命令以官方说明为准,本技能本身不包含额外的安装脚本。
一键安装的通用步骤
- 打开技能入口:在你所使用的 AI 助手客户端/平台的"技能市场""插件中心"或"Skills"面板中,搜索技能英文名
session-logs或技能 ID13569; - 确认依赖:安装界面通常会显示该技能的
requires.bins为["jq","rg"],若检测不到这两个命令,先按上一步装好再继续; - 一键启用:点击安装/启用按钮,技能描述会被注入到助手的系统提示中,此后模型在遇到"引用历史对话"的诉求时会自动触发它;
- 验证是否生效:在对话中直接问一句"帮我列出最近几个会话文件以及它们的大小",如果助手开始执行形如
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do ... done的命令并返回日期与体积列表,说明技能已正常工作。
需要提醒的是:具体的安装命令、市场链接与入口位置随平台版本变化,请以官方说明为准;本技能本身不开设账号、不产生订阅费用。
该技能的主要功能和特点
- 定位精准的触发逻辑:技能被明确限定在"用户询问之前的聊天、父对话、或不在内存文件中的历史上下文"时使用,避免每次对话都去扫盘,造成无谓开销。
- 掌握完整的存储结构知识:它清楚
sessions.json是"会话键 → 会话 ID"的索引文件,清楚每个<session-id>.jsonl是逐行追加的对话记录,也清楚每一行里type、timestamp、message.role、message.content[]的层级关系。 - 只取人类可读内容:通过
select(.type == "text")过滤掉思考过程与工具调用噪声,只把真正的对话文本捞出来,避免把整段 JSON 倾倒给用户。 - 多会话批量检索:借助
rg -l可以一次性在所有.jsonl文件中定位包含某个短语的会话,先缩小范围再精读。 - 自带"成本与用量"分析能力:可以按会话或按天聚合
message.usage.cost.total,输出每日花费;也能统计消息数、用户轮次、助手轮次、首末时间戳。 - 工具调用画像:通过抽取
type=="toolCall"的name字段并sort | uniq -c | sort -rn,能一眼看出某次会话中哪个工具被调用最多。 - 对大体量文件友好:技能明确提示"大型会话可能几 MB,使用
head/tail进行采样",避免一次性把巨型文件读进上下文。 - 可追溯删除记录:被删除的会话保留
.deleted.<timestamp>后缀,仍可被检索到,不会因为"删了"就彻底断线。
和"直接翻聊天记录窗口"这类普通做法相比,它的差异在于:可批量、可聚合、可精确过滤、可跨会话。窗口里只能靠肉眼往上滚,而它能一次扫描几十个会话文件、按角色筛选、按关键字命中、并按成本汇总。
如何使用该技能?
整体使用方式是"自然语言提需求 → 技能组装命令 → 返回结果"。你不需要自己背命令,但了解命令长什么样,能帮你把需求描述得更准。
第 1 步:确认会话目录位置
会话日志位于 ~/.otto/agents/<agentId>/sessions/,其中 <agentId> 取自系统提示 Runtime 行中的 agent=<id> 值。如果你的环境里有多个 agent,务必先确认当前用的是哪一个,否则会去错误的目录里翻找。
第 2 步:先"看一眼目录",建立全局印象
直接说:"帮我按日期和大小列出所有会话文件。"助手会执行:
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
size=$(ls -lh "$f" | awk '{print $5}')
echo "$date $size $(basename $f)"
done | sort -r
输出是"日期 + 体积 + 文件名"的倒序列表,便于你判断该深入哪个会话。
第 3 步:按日期锁定目标会话
说:"找出 2026-01-06 那天的会话。"对应命令:
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f"
done
第 4 步:提取"我当时是怎么问的"
说:"把这个会话里我问过的问题全部列出来。"对应命令:
jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl
输出是一段段纯文本的用户发言,非常适合回顾自己当初的需求演变。
第 5 步:在助手回复中搜关键字
说:"在这个会话的助手回复里搜 ‘缓存’ 相关的内容。"对应命令:
jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl | rg -i "keyword"
第 6 步:跨所有会话找一句话
如果记不清是哪次聊的,直接说:"在所有会话里搜 ‘phrase’ 这个词。"助手会执行:
rg -l "phrase" ~/.otto/agents/<agentId>/sessions/*.jsonl
先返回命中的文件路径,再对命中文件做第 5 步的精读,这是效率最高的"两段式检索"。
第 7 步:做一次用量与成本复盘
- 单会话总成本:
jq -s '[.[] | .message.usage.cost.total // 0] | add' <session>.jsonl - 每日成本汇总:按天取
timestamp,逐文件求和后交给awk聚合,最终输出"日期 + 美元金额"的排行。 - 会话画像:用
jq -s一次性得到messages总数、user轮次、assistant轮次、first/last时间戳。 - 工具使用细分:
jq -r '.message.content[]? | select(.type == "toolCall") | .name' <session>.jsonl | sort | uniq -c | sort -rn。
第 8 步:用"低噪音"模式快速预览
如果你只想要干净的对话流、不想要任何元数据,可以用技能给出的快速纯文本提示:
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.otto/agents/<agentId>/sessions/<id>.jsonl | rg 'keyword'
这一步把"类型过滤 + 文本提取 + 关键字命中"压缩成一条管道,是日常最常用的形态。
同类型竞品对比分析
| 方案名称 | 定位 | 核心功能 | 安装/使用门槛 | 适用场景 | 优势与不足 |
|---|---|---|---|---|---|
| 会话日志Skill(session-logs) | 面向 AI 助手自身会话数据的检索与分析技能 | 用 jq/rg 检索 JSONL、按角色过滤、成本聚合、工具调用统计 |
需具备 jq 与 rg;对话式触发,无需写代码 |
回顾历史对话、复盘用量成本、定位旧方案原文 | 优势:零服务端、数据全在本地、查询模板齐全;不足:仅在具备该技能运行时的平台内生效,需熟悉 JSONL 结构才能自定义复杂查询 |
| 客户端内置的聊天记录搜索 | 通用产品的历史消息搜索框 | 关键字模糊匹配、按时间浏览 | 零门槛,开箱即用 | 快速找某句话 | 优势:最简单;不足:无法按角色/成本/工具调用聚合,无法跨多个会话做结构化统计,超长会话容易搜不全 |
| 通用日志分析平台(ELK / 日志检索类服务) | 面向服务端日志的集中式检索 | 全文索引、可视化看板、告警 | 需部署与维护、需数据接入 | 大规模生产日志分析 | 优势:检索性能与可视化强;不足:对"个人对话记录"这种小体量场景过重,接入成本高、有数据外发顾虑 |
直接 cat / grep 手翻文件 |
最原始的本地排查手段 | 文本打印、简单匹配 | 零依赖(仅需 shell) | 单文件快速查看 | 优势:无需安装任何东西;不足:JSONL 每行嵌套结构,原始输出噪声极大,无法按 role 过滤,也无法求和聚合 |
从对比可以看出,会话日志Skill 的生态位非常清晰:它介于"聊天窗口搜索"和"专业日志平台"之间——比前者多了结构化聚合能力,比后者少了部署与接入成本,特别适合"个人或小团队的 AI 使用复盘"这一细分场景。
该技能的典型应用场景与实际体验情况
场景一:独立开发者回顾旧方案,避免重复设计
痛点:一周前和助手讨论过某个数据表结构,方案细节已从上下文中消失,重新推演要花半小时。使用方式:先 rg -l 搜表名定位会话文件,再用用户消息提取命令把当时的提问全部列出,最后精读助手回复的命中段落。实际体验:整个过程两三条命令即可完成,上手难度低,只要记得关键词,找回原文的成功率很高。注意事项:关键词尽量选唯一性强的名词(如字段名、函数名),避免用"配置""问题"这类高频词。
场景二:团队负责人做 AI 成本复盘
痛点:月底想解释"这个月在 AI 上的花费为什么涨了",但账单只有一个总数,看不到明细分布。使用方式:跑一次每日成本摘要,得到"日期 → 金额"的清单;再对高消耗日期的会话做工具使用细分,看是不是某个自动化流程在反复调用工具。实际体验:效果直观,通常能在一两张表内定位到异常来源。注意事项:message.usage.cost.total 使用 // 0 兜底,说明部分记录可能缺失该字段,汇总时不要假设每条消息都有成本值。
场景三:产品/运营核对"AI 到底说过什么"
痛点:用户反馈"你们助手之前承诺过 X",需要快速核实原话。使用方式:跨所有会话 rg 关键字,命中后按 message.role 分别提取用户侧与助手侧文本,对比确认。实际体验:证据链完整,因为技能说明中明确日志是"只追加的 JSONL",历史记录不会被后续编辑覆盖。注意事项:只筛选 type=="text",思考过程与工具调用不计入,这恰好也是"对用户可见内容"的边界。
场景四:排查一次"工具调用风暴"
痛点:某次会话响应特别慢,怀疑是工具被反复调用。使用方式:对该会话执行工具使用细分,sort | uniq -c | sort -rn 直接给出调用次数排行。实际体验:几分钟内就能看清调用结构。注意事项:会话文件可能有几 MB,建议先 head 采样确认文件规模,再决定是全量解析还是分段处理。
整体上手评价:对于熟悉命令行的开发者,几乎零学习成本;对于非技术用户,只要用自然语言描述需求即可,由助手代为组装命令,同样可用。最容易踩的坑是 <agentId> 用错目录,建议每次任务开始时先确认一次路径。
该技能能为用户带来的价值
效率层面:把"翻聊天记录"从分钟级的肉眼滚动,变成秒级的命令命中。以一次跨 30 个会话文件的检索为例,人工翻找往往需要十几分钟且容易漏,而 rg -l 一次扫描即可给出精确文件列表。
门槛层面:jq 的语法对多数人是劝退项——多层 select、.[] 展开、-s 聚合求和都有学习曲线。技能把这些常见诉求固化成可直接套用的命令模板,用户只需说清意图,等于把"JSON 查询能力"外包给了助手。
决策层面:成本与用量数据让"是否值得继续这样用 AI"从感觉变成数字。每日成本汇总、单会话总成本、消息与轮次统计,构成了一个最小可用的 AI 使用仪表盘。
长期价值:会话日志是只追加的、带时间戳的、可被程序读取的资产。今天做的检索模板,明天、下个月依然适用;随着会话数量增长,这份"可查询的个人知识库"价值会持续放大,而不是像上下文窗口那样用完即忘。
风险控制层面:所有数据保存在本地目录、由本地命令处理,不涉及把对话内容上传给第三方分析服务,对注重隐私的用户更友好。
常见问题 FAQ
Q1:这个技能怎么安装?需要收费吗?
A:在平台的技能市场/插件中心搜索 session-logs 或技能 ID 13569,点击安装或启用即可。安装前请确保系统里已有 jq 和 rg 两个命令,它们是本技能唯一的运行时依赖。技能本身不涉及订阅费用,安装入口与具体命令请以官方说明为准。
Q2:我不会写 jq 命令,还能用它吗?
A:完全可以。这个技能的触发条件是"用户询问之前的聊天、父对话或历史上下文",你只需要用自然语言提需求,例如"帮我在上周的会话里找关于缓存的讨论",助手会自行组装并执行对应命令,再把结果转述给你。会一点命令的好处是能把需求描述得更精确。
Q3:它和聊天窗口里的搜索框有什么区别?
A:窗口搜索通常是"关键字模糊匹配",而这个技能可以按 message.role 区分用户与助手、只提取 type=="text" 的可读文本、跨多个会话文件批量定位,还能对成本、消息数、工具调用次数做聚合统计。简单说:搜索框回答"有没有这句话",它回答"这句话在哪个会话、谁说的、那次会话花了多少钱、调了哪些工具"。
Q4:适合谁用?
A:三类人最受益——需要频繁回溯旧方案的开发者;想复盘 AI 使用成本与使用模式的团队负责人;以及需要核实"AI 曾说过什么"的产品与运营人员。如果你只是偶尔用一次 AI、从不需要引用历史对话,那么不安装它也不影响日常使用。
Q5:会话被删除了还能查到吗?
A:技能说明中提到,被删除的会话会保留 .deleted.<timestamp> 后缀,因此仍可能被检索到。但这属于残留文件,是否长期保留取决于所在平台的清理策略,不建议把它当作合规意义上的归档手段。另外,日志为只追加结构,历史消息不会被后续编辑覆盖。