session保存格式結構如下:
84171-0j50xl0z9ulr.png

json格式化如下:
96351-8qclkt3iwr.png

為什麼選擇 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 數
output_tokens Claude 生成的 token 數 5× (opus-4)
cache_creation_input_tokens 首次建立 cache 的 token 1.25×
cache_read_input_tokens 從 cache 讀取的 token 0.1×

01242-3gpq8zxrt6k.png

這裏面關於 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%)

無標籤

新增評論