作者:互联网 时间: 2026-08-08 16:00:01
session-logs 技能提供了一个强大的界面,用于搜索和分析存储在会话 JSONL 文件中的历史对话数据。它通过提供对智能体生成的每一次交流、元数据和工具使用记录的程序化访问,使用户能够弥合当前交互与过去上下文之间的鸿沟。
通过利用 jq 和 rg 等强大的 CLI 工具,Openclaw Skills 生态系统中的这一项将原始日志文件转化为可操作的情报。无论您是需要从数周前的线程中恢复特定信息,还是审计自动化的财务开销,此技能都能为专业的智能体管理提供所需的精度。
下载入口:https://github.com/openclaw/skills/tree/main/skills/guogang1024/session-logs从源直接安装技能的最快方式。
npx clawhub@latest install session-logs
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
<project>/skills/
优先级:工作区 > 本地 > 内置
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 session-logs。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
要使用此技能,请确保您的环境中安装了 jq 和 ripgrep (rg)。这些二进制文件对于 Openclaw Skills 的日志处理能力至关重要。
# 在 macOS 上安装依赖项
brew install jq ripgrep
# 在 Ubuntu/Debian 上安装依赖项
sudo apt-get install jq ripgrep
无需进一步配置,因为该技能会自动检测位于 ~/.clawdbot/agents/<agentId>/sessions/ 的会话路径。
该技能与 JSONL 文件交互,其中每一行代表一个离散的事件或消息。该架构针对高速过滤进行了优化。
| 字段 | 类型 | 描述 |
|---|---|---|
type |
string | 定义记录类型:"session"(元数据)或 "message"。 |
timestamp |
string | 事件的 ISO-8601 格式时间戳。 |
message.role |
string | 识别发送者:"user"、"assistant" 或 "toolResult"。 |
message.content |
array | 包含文本块、思考块或工具调用对象。 |
message.usage.cost.total |
number | 特定响应的计算美元成本。 |
name: session-logs
description: Search and analyze your own session logs (older/parent conversations) using jq.
metadata: {"openclaw":{"emoji":"??","requires":{"bins":["jq","rg"]}}}
Search your complete conversation history stored in session JSONL files. Use this when a user references older/parent conversations or asks what was said before.
Use this skill when the user asks about prior chats, parent conversations, or historical context that isn’t in memory files.
Session logs live at: ~/.clawdbot/agents/<agentId>/sessions/ (use the agent=<id> value from the system prompt Runtime line).
sessions.json - Index mapping session keys to session IDs<session-id>.jsonl - Full conversation transcript per sessionEach .jsonl file contains messages with:
type: "session" (metadata) or "message"timestamp: ISO timestampmessage.role: "user", "assistant", or "toolResult"message.content[]: Text, thinking, or tool calls (filter type=="text" for human-readable content)message.usage.cost.total: Cost per responsefor f in ~/.clawdbot/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 ~/.clawdbot/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 ~/.clawdbot/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" ~/.clawdbot/agents/<agentId>/sessions/*.jsonl
head/tail for samplingsessions.json index maps chat providers (discord, whatsapp, etc.) to session IDs.deleted.<timestamp> suffixjq -r 'select(.type=="message") | .message.content[]? | select(.type=="text") | .text' ~/.clawdbot/agents/<agentId>/sessions/<id>.jsonl | rg 'keyword'