用途
session-logs 用于搜索和分析自身的会话日志,即较早或父级的对话历史。当用户引用较旧的对话,或询问之前说过什么、需要不在记忆文件中的历史上下文时,可以触发该技能。
日志位置与结构
会话日志位于活动状态目录下:$OPENCLAW_STATE_DIR/agents/<agentId>/sessions/(默认:~/.openclaw/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:每次响应的费用
常用查询
按日期和大小列出所有会话:
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
for f in "$SESSION_DIR"/*.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
查找特定日期的会话:
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
for f in "$SESSION_DIR"/*.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
按日汇总费用:
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
for f in "$SESSION_DIR"/*.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
跨所有会话搜索短语:
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
rg -l "phrase" "$SESSION_DIR"/*.jsonl
仅文本的快速提示(低噪声):
AGENT_ID="<agentId>"
SESSION_DIR="${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/agents/$AGENT_ID/sessions"
jq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' "$SESSION_DIR"/<id>.jsonl | rg 'keyword'
提示
- 会话为追加写入的 JSONL(每行一个 JSON 对象)
- 大型会话可能有数 MB,可使用 head/tail 进行采样
- sessions.json 索引将聊天提供方(discord、whatsapp 等)映射到会话 ID
- 已删除的会话带有 .deleted.<timestamp> 后缀
限制
以上为技能说明中提供的功能与操作方式;关于平台兼容性、权限要求、性能上限等未在资料中说明,暂未提供。