name: session-logs description: 使用jq搜索和分析您自己的会话日志(旧/父对话)。 metadata: { “otto”: { “emoji”: “📜”, “requires”: { “bins”: [“jq”, “rg”] } } }
会话日志
搜索存储在会话JSONL文件中的完整对话历史。当用户引用旧/父对话或询问之前说了什么时使用此技能。
触发条件
当用户询问之前的聊天、父对话或不在内存文件中的历史上下文时使用此技能。
位置
会话日志位于:~/.otto/agents/<agentId>/sessions/(使用系统提示Runtime行中的agent=<id>值)。
sessions.json- 将会话键映射到会话ID的索引<session-id>.jsonl- 每个会话的完整对话记录
结构
每个.jsonl文件包含以下消息:
type: “session”(元数据)或 “message”timestamp: ISO时间戳message.role: “user”、“assistant"或"toolResult”message.content[]: 文本、思考或工具调用(过滤type=="text"以获取人类可读内容)message.usage.cost.total: 每个响应的成本
常见查询
按日期和大小列出所有会话
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
查找特定日期的会话
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
head -1 "$f" | jq -r '.timestamp' | grep -q "2026-01-06" && echo "$f"
done
从会话中提取用户消息
jq -r 'select(.message.role == "user") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl
在助手响应中搜索关键字
jq -r 'select(.message.role == "assistant") | .message.content[]? | select(.type == "text") | .text' <session>.jsonl | rg -i "keyword"
获取会话的总成本
jq -s '[.[] | .message.usage.cost.total // 0] | add' <session>.jsonl
每日成本摘要
for f in ~/.otto/agents/<agentId>/sessions/*.jsonl; do
date=$(head -1 "$f" | jq -r '.timestamp' | cut -dT -f1)
cost=$(jq -s '[.[] | .message.usage.cost.total // 0] | add' "$f")
echo "$date $cost"
done | awk '{a[$1]+=$2} END {for(d in a) print d, "$"a[d]}' | sort -r
计算会话中的消息和令牌数
jq -s '{
messages: length,
user: [.[] | select(.message.role == "user")] | length,
assistant: [.[] | select(.message.role == "assistant")] | length,
first: .[0].timestamp,
last: .[-1].timestamp
}' <session>.jsonl
工具使用细分
jq -r '.message.content[]? | select(.type == "toolCall") | .name' <session>.jsonl | sort | uniq -c | sort -rn
在所有会话中搜索短语
rg -l "phrase" ~/.otto/agents/<agentId>/sessions/*.jsonl
提示
- 会话是只追加的JSONL(每行一个JSON对象)
- 大型会话可能几MB - 使用
head/tail进行采样 sessions.json索引映射聊天提供者(discord、whatsapp等)到会话ID- 删除的会话有
.deleted.<timestamp>后缀
快速纯文本提示(低噪音)
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.otto/agents/<agentId>/sessions/<id>.jsonl | rg 'keyword'