深入解析 Claude Code Session History:JSONL 格式、訊息結構與快取費用優化
session保存格式結構如下:

json格式化如下:

為什麼選擇 JSONL?
Claude Code 沒有使用資料庫,而是選擇了最簡單的格式:每個 session 一個 .jsonl 檔案,每行一條 JSON 訊息。
| 比較面向 | JSONL 格式 | 關聯式資料庫 |
|---|---|---|
| 讀取方式 | 任何文字編輯器、cat |
需要 DB 驅動 |
| 追加速度 | 極快(append-only) | 需要 transaction |
| 查詢能力 | 低(需全掃) | 高(SQL) |
| 跨機器遷移 | 複製檔案即可 | 需要 dump/restore |
| 故障恢復 | 行級別,單行壞掉不影響其他行 | 依賴 transaction log |
| 版本控制 | 可用 git 追蹤 | 不適合 |
結論:AI 對話是只增不改、需要人類可讀、不需要複雜查詢的應用場景,所以JSONL 是最合適的選擇。
然後可以看到jsonl裏面的chat内容包含以下
session 啟動
├── 寫入第一條 user 訊息
├── 寫入 assistant 回覆
├── 寫入 tool_result
├── 寫入下一條 user 訊息
...
└── session 結束(檔案不再修改)
這説明在 ~/.claude/projects/ 裡每一個 .jsonl 檔案都對應一個獨立的 session。如下:
~/.claude/
├── projects/
│ └── -Users-jack-myproject/ ← 專案目錄(路徑編碼)
│ ├── abc123.jsonl ← session 1
│ ├── def456.jsonl ← session 2
│ └── ghi789.jsonl ← session 3
└── settings.json
然後可以看到訊息結構如下:
頂層訊息結構
{
"uuid": "3a7f-...", // 每條訊息的唯一 ID
"parentUuid": "2b1e-...", // 父訊息 ID(形成對話樹)
"sessionId": "abc-123", // 所在 session 的 ID
"timestamp": "2025-06-15T10:30:00.000Z",
"type": "user", // 訊息類型(見 §3)
"isSidechain": false, // 是否為旁支對話
"cwd": "/Users/jack/myproject",
"version": "1.0.35",
"message": { ... }, // 核心內容(見下)
"toolUseResult": { ... } // 工具執行結果
}
User 訊息:
{
"message": {
"role": "user",
"content": "幫我分析這段程式碼"
}
}
Assistant 訊息(含 token 統計):
{
"message": {
"role": "assistant",
"id": "msg_01...",
"model": "claude-opus-4-20250514",
"content": [ ... ],
"stop_reason": "tool_use",
"usage": {
"input_tokens": 5420,
"output_tokens": 312,
"cache_creation_input_tokens": 20238,
"cache_read_input_tokens": 18500
}
}
}
然後訊息分爲以下幾類
| type | 觸發時機 | 包含的關鍵資訊 |
|---|---|---|
user |
你送出任何訊息 | 你的文字、tool_result |
assistant |
Claude 回覆 | 文字、tool_use、usage |
summary |
執行 /compact 後 |
msg.summary(摘要文字) |
system |
Session 初始化 | 系統提示詞 |
然後 Assistant message 的 usage 欄位
| 欄位 | 說明 | 費用倍數(相對 input) |
|---|---|---|
input_tokens |
本次送出的 token 數 | 1× |
output_tokens |
Claude 生成的 token 數 | 5× (opus-4) |
cache_creation_input_tokens |
首次建立 cache 的 token | 1.25× |
cache_read_input_tokens |
從 cache 讀取的 token | 0.1× |

這裏面關於 token 的重要信息
Claude Code 會自動快取你的 CLAUDE.md、專案檔案等長文件。當同一 session 中多次發送相似的上下文,後面的訊息可以從快取讀取,費用只有原來的 10%。
實際例子:
- 沒有快取:20,000 input tokens × $15/MTok = $0.30
- 有快取命中:20,000 cache_read tokens × $1.50/MTok = $0.03(省 90%)