Chapter 16

Session Management

Understanding how the Claude Agent SDK handles sessions and session resumption.

The Claude Agent SDK provides session management capabilities for handling conversation state and resumption. Sessions allow you to continue conversations across multiple interactions while maintaining full context.

How Sessions Work

When you start a new query, the SDK automatically creates a session and returns a session ID in the initial system message. You can capture this ID to resume the session later.

Getting the Session ID

get-session-id.ts
import { query } from "@anthropic-ai/claude-agent-sdk";

let sessionId: string | undefined;

const response = query({
  prompt: "Help me build a web application",
  options: {
    model: "claude-sonnet-4-5"
  }
});

for await (const message of response) {
  // The first message is a system init message with the session ID
  if (message.type === 'system' && message.subtype === 'init') {
    sessionId = message.session_id;
    console.log(`Session started with ID: ${sessionId}`);
  }
}

Resuming Sessions

The SDK supports resuming sessions from previous conversation states, enabling continuous development workflows. Use the resume option with a session ID to continue a previous conversation.

resume-session.ts
import { query } from "@anthropic-ai/claude-agent-sdk";

// Resume a previous session using its ID
const response = query({
  prompt: "Continue implementing the auth system",
  options: {
    resume: "session-xyz",  // Session ID from previous conversation
    model: "claude-sonnet-4-5",
    allowedTools: ["Read", "Edit", "Write", "Bash"]
  }
});

// The conversation continues with full context
for await (const message of response) {
  console.log(message);
}

Tip

The SDK automatically handles loading the conversation history and context when you resume a session, allowing Claude to continue exactly where it left off.

Forking Sessions

When resuming a session, you can choose to either continue the original session or fork it into a new branch. By default, resuming continues the original session. Use the forkSession option (TypeScript) or fork_session option (Python) to create a new session ID that starts from the resumed state.

When to Fork a Session

Forking is useful when you want to:

  • Explore different approaches from the same starting point
  • Create multiple conversation branches without modifying the original
  • Test changes without affecting the original session history
  • Maintain separate conversation paths for different experiments

Forking vs Continuing

BehaviorforkSession: false (default)forkSession: true
Session IDSame as originalNew session ID generated
HistoryAppends to original sessionCreates new branch from resume point
Original SessionModifiedPreserved unchanged
Use CaseContinue linear conversationBranch to explore alternatives

Example: Forking a Session

fork-session.ts
import { query } from "@anthropic-ai/claude-agent-sdk";

// First, capture the session ID
let sessionId: string | undefined;

const response = query({
  prompt: "Help me design a 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(`Original session: ${sessionId}`);
  }
}

// Fork the session to try a different approach
const forkedResponse = query({
  prompt: "Redesign this as a GraphQL API instead",
  options: {
    resume: sessionId,
    forkSession: true,  // Creates a new session ID
    model: "claude-sonnet-4-5"
  }
});

for await (const message of forkedResponse) {
  if (message.type === 'system' && message.subtype === 'init') {
    console.log(`Forked session: ${message.session_id}`);
    // This will be a different session ID
  }
}

// The original session remains unchanged and can still be resumed
const originalContinued = query({
  prompt: "Add authentication to the REST API",
  options: {
    resume: sessionId,
    forkSession: false,  // Continue original (default)
    model: "claude-sonnet-4-5"
  }
});

Related resources

  • -Configure Permissions: Control how your agent uses tools
  • -Handle User Input: Surface approval requests and questions to users
  • -Capabilities: Explore hooks, subagents, and MCP integration