セッション管理

Claude Agent SDKは、会話状態と再開を処理するためのセッション管理機能を提供します。セッションを使用すると、完全なコンテキストを維持しながら、複数のやり取りにわたって会話を継続できます。

セッションの仕組み

新しいクエリを開始すると、SDKは自動的にセッションを作成し、初期システムメッセージでセッションIDを返します。このIDをキャプチャして、後でセッションを再開できます。

セッションIDの取得

import { query } from "@anthropic-ai/claude-agent-sdk"

let sessionId: string | undefined

const response = query({
  prompt: "Webアプリケーションの構築を手伝ってください",
  options: {
    model: "claude-sonnet-4-5"
  }
})

for await (const message of response) {
  // 最初のメッセージは、セッションIDを含むシステム初期化メッセージです
  if (message.type === 'system' && message.subtype === 'init') {
    sessionId = message.session_id
    console.log(`セッションが開始されました。ID: ${sessionId}`)
    // このIDを後で再開するために保存できます
  }

  // 他のメッセージを処理...
  console.log(message)
}

// 後で、保存されたsessionIdを使用して再開できます
if (sessionId) {
  const resumedResponse = query({
    prompt: "中断したところから続けてください",
    options: {
      resume: sessionId
    }
  })
}

セッションの再開

SDKは以前の会話状態からのセッション再開をサポートし、継続的な開発ワークフローを可能にします。セッションIDとresumeオプションを使用して、以前の会話を継続します。
import { query } from "@anthropic-ai/claude-agent-sdk"

// IDを使用して以前のセッションを再開
const response = query({
  prompt: "中断したところから認証システムの実装を続けてください",
  options: {
    resume: "session-xyz", // 以前の会話からのセッションID
    model: "claude-sonnet-4-5",
    allowedTools: ["Read", "Edit", "Write", "Glob", "Grep", "Bash"]
  }
})

// 会話は以前のセッションからの完全なコンテキストで継続されます
for await (const message of response) {
  console.log(message)
}
SDKは、セッションを再開する際に会話履歴とコンテキストの読み込みを自動的に処理し、Claudeが中断したところから正確に継続できるようにします。

セッションのフォーク

セッションを再開する際、元のセッションを継続するか、新しいブランチにフォークするかを選択できます。デフォルトでは、再開は元のセッションを継続します。forkSessionオプション(TypeScript)またはfork_sessionオプション(Python)を使用して、再開状態から開始する新しいセッションIDを作成します。

セッションをフォークするタイミング

フォークは以下の場合に有用です:
  • 同じ開始点から異なるアプローチを探索する
  • 元のセッションを変更せずに複数の会話ブランチを作成する
  • 元のセッション履歴に影響を与えずに変更をテストする
  • 異なる実験のために別々の会話パスを維持する

フォーク vs 継続

動作forkSession: false(デフォルト)forkSession: true
セッションID元のセッションと同じ新しいセッションIDが生成される
履歴元のセッションに追加再開ポイントから新しいブランチを作成
元のセッション変更される変更されずに保持される
使用例線形会話を継続代替案を探索するためにブランチ

例:セッションのフォーク

import { query } from "@anthropic-ai/claude-agent-sdk"

// まず、セッションIDをキャプチャ
let sessionId: string | undefined

const response = query({
  prompt: "REST APIの設計を手伝ってください",
  options: { model: "claude-sonnet-4-5" }
})

for await (const message of response) {
  if (message.type === 'system' && message.subtype === 'init') {
    sessionId = message.session_id
    console.log(`元のセッション: ${sessionId}`)
  }
}

// セッションをフォークして異なるアプローチを試す
const forkedResponse = query({
  prompt: "今度はこれをGraphQL APIとして再設計しましょう",
  options: {
    resume: sessionId,
    forkSession: true,  // 新しいセッションIDを作成
    model: "claude-sonnet-4-5"
  }
})

for await (const message of forkedResponse) {
  if (message.type === 'system' && message.subtype === 'init') {
    console.log(`フォークされたセッション: ${message.session_id}`)
    // これは異なるセッションIDになります
  }
}

// 元のセッションは変更されず、まだ再開できます
const originalContinued = query({
  prompt: "REST APIに認証を追加してください",
  options: {
    resume: sessionId,
    forkSession: false,  // 元のセッションを継続(デフォルト)
    model: "claude-sonnet-4-5"
  }
})