토큰 임계값에서의 컴팩션

토큰 임계값에서의 컴팩션 (Compaction at a token threshold)

임계값 컴팩션은 자동 컴팩션 방식이에요. 일반 요청에 토큰 임계값을 설정하면, API가 요청 처리 중 임계값에 도달하는 순간 이전 컨텍스트를 요약해 줘요. 요약 시점을 직접 정하는 요청 시 컴팩션(Compaction on demand)과 함께 사용할 수 있어요. 둘 중 무엇을 쓸지 고르려면 컴팩션 방식 고르기를 보세요. 컨텍스트 창 한도에 다가갈 때 이전 컨텍스트를 자동으로 요약해 긴 대화와 작업의 유효한 컨텍스트 길이를 확장해 줘요. 또 컨텍스트 창이 작아지면 응답 품질도 떨어지므로, 활성 컨텍스트를 작게 유지해 주는 역할도 해요. 이 기능은 베타 상태이고 compact-2026-01-12 베타 헤더가 필요해요.

출처: 문서

본문

팁: 긴 컨텍스트가 왜 저하되고 컴팩션이 어떻게 도움이 되는지 더 깊이 보려면 Effective context engineering을 보세요.

이 기능은 다음에 이상적이에요:

  • 사용자가 한 채팅을 오랫동안 쓰길 원하는 채팅 기반 다중 턴 대화
  • 컨텍스트 창을 넘어설 수 있는 많은 후속 작업(주로 도구 사용)이 필요한 작업 지향 프롬프트

컴팩션 동작 방식

컴팩션이 활성화되면 Claude는 설정한 토큰 임계값에 도달했을 때 대화를 자동으로 요약해요. API는 다음을 수행해요:

  1. 입력 토큰이 지정한 트리거 임계값에 도달했는지 감지해요.
  2. 현재 대화의 요약을 생성해요.
  3. 요약을 담은 compaction 블록을 만들어요.
  4. 컴팩션된 컨텍스트로 응답을 계속해요.

이후 요청에서는 응답을 메시지에 추가해요. API는 compaction 블록 이전의 모든 콘텐츠 블록을 자동으로 버리고 요약부터 대화를 계속해요.

Compaction flow: when input tokens reach the trigger, Claude writes a summary into a compaction block and continues

기본 사용법

Messages API 요청의 context_management.edits에 compact_20260112 전략을 추가해 컴팩션을 활성화해요.

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Help me build a website"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112"
        }
      ]
    }
  }'
ant beta:messages create --beta compact-2026-01-12 <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Help me build a website
context_management:
  edits:
    - type: compact_20260112
YAML
client = anthropic.Anthropic()

messages = [{"role": "user", "content": "Help me build a website"}]

response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={"edits": [{"type": "compact_20260112"}]},
)

# Append the response (including any compaction block) to continue the conversation
messages.append({"role": "assistant", "content": response.content})
const client = new Anthropic();

const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Help me build a website" }
];

const response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112"
      }
    ]
  }
});

// Append the response (including any compaction block) to continue the conversation
messages.push({
  role: "assistant",
  content: response.content
});
AnthropicClient client = new();

var messages = new List<BetaMessageParam>
{
    new() { Role = Role.User, Content = "Help me build a website" }
};

var parameters = new MessageCreateParams
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit()]
    }
};

var response = await client.Beta.Messages.Create(parameters);

// Append the response (including any compaction block) to continue the conversation
messages.Add(new BetaMessageParam
{
    Role = Role.Assistant,
    Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList()
});

Console.WriteLine(response);
client := anthropic.NewClient()

messages := []anthropic.BetaMessageParam{
	anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website")),
}

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:     anthropic.ModelClaudeOpus5_5,
	MaxTokens: 4096,
	Messages:  messages,
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}

// Append the response (including any compaction block) to continue the conversation
messages = append(messages, response.ToParam())

fmt.Println(response)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCreateParams params = MessageCreateParams.builder()
            .addBeta("compact-2026-01-12")
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .addUserMessage("Help me build a website")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder().build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);

        // Append the response (including any compaction block) to continue the conversation
        // by including it in the next request's messages
        System.out.println(response);
$client = new Client();

$messages = [
    ['role' => 'user', 'content' => 'Help me build a website']
];

$response = $client->beta->messages->create(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            ['type' => 'compact_20260112']
        ]
    ]
);

// Append the response (including any compaction block) to continue the conversation
$messages[] = ['role' => 'assistant', 'content' => $response->content];

echo json_encode($response, JSON_PRETTY_PRINT), PHP_EOL;
client = Anthropic::Client.new

messages = [
  { role: "user", content: "Help me build a website" }
]

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
)

# Append the response (including any compaction block) to continue the conversation
messages << { role: "assistant", content: response.content }

puts response

매개변수

매개변수 타입 기본값 설명
type string 필수 "compact_20260112"이어야 해요.
trigger object {"type": "input_tokens", "value": 150000} 컴팩션을 언제 트리거할지 정해요. input_tokens가 유일하게 지원되는 트리거 타입이에요. value는 최소 50,000 토큰이어야 해요.
pause_after_compaction boolean false 컴팩션 요약 생성 후 일시 정지할지 여부
instructions string null 사용자 지정 요약 프롬프트. 제공하면 기본 프롬프트를 완전히 대체해요.

트리거 구성

trigger 매개변수로 컴팩션 트리거 시점을 구성해요:

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112",
          "trigger": {
            "type": "input_tokens",
            "value": 150000
          }
        }
      ]
    }
  }'
ant beta:messages create --beta compact-2026-01-12 <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
      trigger:
        type: input_tokens
        value: 150000
YAML
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={
        "edits": [
            {
                "type": "compact_20260112",
                "trigger": {"type": "input_tokens", "value": 150000},
            }
        ]
    },
)
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];

const response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        trigger: {
          type: "input_tokens",
          value: 150000
        }
      }
    ]
  }
});
AnthropicClient client = new();
List<BetaMessageParam> messages = [new() { Role = Role.User, Content = "Hello" }];

var parameters = new MessageCreateParams
{
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Betas = ["compact-2026-01-12"],
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit
        {
            Trigger = new BetaInputTokensTrigger(150000)
        }]
    }
};

var message = await client.Beta.Messages.Create(parameters);
Console.WriteLine(message);
client := anthropic.NewClient()
messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:     anthropic.ModelClaudeOpus5_5,
	MaxTokens: 4096,
	Messages:  messages,
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{
				Trigger: anthropic.BetaInputTokensTriggerParam{Value: 150000},
			}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}
fmt.Println(response)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCreateParams params = MessageCreateParams.builder()
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .addBeta("compact-2026-01-12")
            .addUserMessage("Hello, Claude")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder()
                    .trigger(BetaInputTokensTrigger.builder()
                        .value(150000L)
                        .build())
                    .build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);
        System.out.println(response);
$client = new Client();
$messages = [['role' => 'user', 'content' => 'Hello, Claude']];

$message = $client->beta->messages->create(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            [
                'type' => 'compact_20260112',
                'trigger' => [
                    'type' => 'input_tokens',
                    'value' => 150000
                ]
            ]
        ]
    ]
);

echo $message;
client = Anthropic::Client.new
messages = [{ role: "user", content: "Hello, Claude" }]

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        trigger: {
          type: "input_tokens",
          value: 150000
        }
      }
    ]
  }
)
puts response

사용자 지정 요약 지시

기본 요약 프롬프트는 모델마다 달라요. 각 기본값은 Claude가 <summary></summary> 태그 안에 미래 컨텍스트 창에서 작업을 계속하는 데 필요한 정보로 요약을 쓰도록 지시해요. 예를 들어 일부 모델은 다음 프롬프트를 사용해요:

You have written a partial transcript for the initial task above. Please write a summary of the transcript. The purpose of this summary is to provide continuity so you can continue to make progress towards solving the task in a future context, where the raw history above may not be accessible and will be replaced with this summary. Write down anything that would be helpful, including the state, next steps, learnings etc. You must wrap your summary in a <summary></summary> block.

instructions 매개변수로 사용자 지정 지시를 제공할 수 있어요. 사용자 지정 지시는 기본 프롬프트를 보완하지 않아요. 완전히 대체해요:

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112",
          "instructions": "Focus on preserving code snippets, variable names, and technical decisions."
        }
      ]
    }
  }'
ant beta:messages create --beta compact-2026-01-12 <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
      instructions: >-
        Focus on preserving code snippets, variable names, and
        technical decisions.
YAML
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={
        "edits": [
            {
                "type": "compact_20260112",
                "instructions": "Focus on preserving code snippets, variable names, and technical decisions.",
            }
        ]
    },
)
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];

const response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        instructions:
          "Focus on preserving code snippets, variable names, and technical decisions."
      }
    ]
  }
});
AnthropicClient client = new();

var parameters = new MessageCreateParams
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Messages =
    [
        new BetaMessageParam { Role = Role.User, Content = "Help me build a Python web scraper" },
        new BetaMessageParam { Role = Role.Assistant, Content = "I'll help you build a web scraper..." },
        new BetaMessageParam { Role = Role.User, Content = "Add support for JavaScript-rendered pages" }
    ],
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit
        {
            Instructions = "Focus on preserving code snippets, variable names, and technical decisions."
        }]
    }
};

var message = await client.Beta.Messages.Create(parameters);
Console.WriteLine(message);
client := anthropic.NewClient()

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:     anthropic.ModelClaudeOpus5_5,
	MaxTokens: 4096,
	Messages: []anthropic.BetaMessageParam{
		anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a Python web scraper")),
		{Role: anthropic.BetaMessageParamRoleAssistant, Content: []anthropic.BetaContentBlockParamUnion{anthropic.NewBetaTextBlock("I'll help you build a web scraper...")}},
		anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Add support for JavaScript-rendered pages")),
	},
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{
				Instructions: anthropic.String("Focus on preserving code snippets, variable names, and technical decisions."),
			}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}
fmt.Println(response)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCreateParams params = MessageCreateParams.builder()
            .addBeta("compact-2026-01-12")
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .addUserMessage("Help me build a Python web scraper")
            .addAssistantMessage("I'll help you build a web scraper...")
            .addUserMessage("Add support for JavaScript-rendered pages")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder()
                    .instructions("Focus on preserving code snippets, variable names, and technical decisions.")
                    .build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);
        System.out.println(response);
$client = new Client();

$response = $client->beta->messages->create(
    maxTokens: 4096,
    messages: [
        ['role' => 'user', 'content' => 'Help me build a Python web scraper'],
        ['role' => 'assistant', 'content' => "I'll help you build a web scraper..."],
        ['role' => 'user', 'content' => 'Add support for JavaScript-rendered pages']
    ],
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            [
                'type' => 'compact_20260112',
                'instructions' => 'Focus on preserving code snippets, variable names, and technical decisions.'
            ]
        ]
    ]
);

echo json_encode($response, JSON_PRETTY_PRINT), PHP_EOL;
client = Anthropic::Client.new

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: [
    { role: "user", content: "Help me build a Python web scraper" },
    { role: "assistant", content: "I'll help you build a web scraper..." },
    { role: "user", content: "Add support for JavaScript-rendered pages" }
  ],
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        instructions:
          "Focus on preserving code snippets, variable names, and technical decisions."
      }
    ]
  }
)

puts response

Claude 5.1 이상 모델에서 사용자 지정 instructions를 쓰는 요청은 보이는 대화에서만 요약을 만들고, 이전 thinking 블록은 요약기의 입력에 포함되지 않아요.

컴팩션 후 일시 정지

pause_after_compaction을 사용해 컴팩션 요약을 생성한 뒤 API를 일시 정지할 수 있어요. 이렇게 하면 API가 응답을 계속하기 전에 추가 콘텐츠 블록(예: 최근 메시지나 특정 지시 메시지 보존)을 추가할 수 있어요.

활성화하면 API는 컴팩션 블록을 생성한 뒤 compaction 중지 이유를 가진 메시지를 반환해요:

# pause_after_compaction stops the response right after the compaction
# summary so you can adjust the messages before continuing. The continue
# step doesn't translate well to a one-off shell command; see the SDK tabs
# for the full pause-and-continue flow. Single paused request:
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112",
          "pause_after_compaction": true
        }
      ]
    }
  }'
# pause_after_compaction stops the response right after the compaction
# summary so you can adjust the messages before continuing. The continue
# step doesn't translate well to a one-off CLI command; see the SDK tabs
# for the full pause-and-continue flow. Single paused request:
ant beta:messages create --beta compact-2026-01-12 --format jsonl <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
      pause_after_compaction: true
YAML
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={
        "edits": [{"type": "compact_20260112", "pause_after_compaction": True}]
    },
)

# Check if compaction triggered a pause
if response.stop_reason == "compaction":
    # Response contains only the compaction block
    messages.append({"role": "assistant", "content": response.content})

    # Continue the request
    response = client.beta.messages.create(
        betas=["compact-2026-01-12"],
        model="claude-opus-5-5",
        max_tokens=4096,
        messages=messages,
        context_management={"edits": [{"type": "compact_20260112"}]},
    )
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];

let response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        pause_after_compaction: true
      }
    ]
  }
});

// Check if compaction triggered a pause
if (response.stop_reason === "compaction") {
  // Response contains only the compaction block
  messages.push({
    role: "assistant",
    content: response.content
  });

  // Continue the request
  response = await client.beta.messages.create({
    betas: ["compact-2026-01-12"],
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages,
    context_management: {
      edits: [{ type: "compact_20260112" }]
    }
  });
}
var client = new AnthropicClient();
var messages = new List<BetaMessageParam>
{
    new() { Role = Role.User, Content = "Hello, Claude" }
};

var parameters = new MessageCreateParams
{
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Betas = ["compact-2026-01-12"],
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit
        {
            PauseAfterCompaction = true
        }]
    }
};

var response = await client.Beta.Messages.Create(parameters);

if (response.StopReason == BetaStopReason.Compaction)
{
    messages.Add(new BetaMessageParam
    {
        Role = Role.Assistant,
        Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList()
    });

    parameters = new()
    {
        Model = "claude-opus-5-5",
        MaxTokens = 4096,
        Betas = ["compact-2026-01-12"],
        Messages = messages,
        ContextManagement = new BetaContextManagementConfig
        {
            Edits = [new BetaCompact20260112Edit()]
        }
    };

    response = await client.Beta.Messages.Create(parameters);
}

Console.WriteLine(response);
client := anthropic.NewClient()
messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}

compactEdit := anthropic.BetaContextManagementConfigParam{
	Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
		{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{
			PauseAfterCompaction: anthropic.Bool(true),
		}},
	},
}

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:             anthropic.ModelClaudeOpus5_5,
	MaxTokens:         4096,
	Messages:          messages,
	ContextManagement: compactEdit,
	Betas:             []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}

if response.StopReason == "compaction" {
	messages = append(messages, response.ToParam())

	response, err = client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
		Model:     anthropic.ModelClaudeOpus5_5,
		MaxTokens: 4096,
		Messages:  messages,
		ContextManagement: anthropic.BetaContextManagementConfigParam{
			Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
				{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
			},
		},
		Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
	})
	if err != nil {
		log.Fatal(err)
	}
}

fmt.Println(response)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
import com.anthropic.models.beta.messages.BetaStopReason;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCreateParams params = MessageCreateParams.builder()
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .addBeta("compact-2026-01-12")
            .addUserMessage("Help me build a website")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder()
                    .pauseAfterCompaction(true)
                    .build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);

        // Check if compaction triggered a pause
        if (response.stopReason().isPresent()
                && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
            // Append the compaction block and continue the request
            // by building a new request with the compacted context
            MessageCreateParams continueParams = MessageCreateParams.builder()
                .model("claude-opus-5-5")
                .maxTokens(4096L)
                .addBeta("compact-2026-01-12")
                .addUserMessage("Help me build a website")
                .addMessage(response)
                .contextManagement(BetaContextManagementConfig.builder()
                    .addEdit(BetaCompact20260112Edit.builder().build())
                    .build())
                .build();

            response = client.beta().messages().create(continueParams);
        }

        System.out.println(response);
$client = new Client();
$messages = [['role' => 'user', 'content' => 'Hello, Claude']];

$response = $client->beta->messages->create(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            [
                'type' => 'compact_20260112',
                'pause_after_compaction' => true
            ]
        ]
    ]
);

if ($response->stopReason === 'compaction') {
    $messages[] = [
        'role' => 'assistant',
        'content' => $response->content
    ];

    $response = $client->beta->messages->create(
        maxTokens: 4096,
        messages: $messages,
        model: 'claude-opus-5-5',
        betas: ['compact-2026-01-12'],
        contextManagement: [
            'edits' => [
                ['type' => 'compact_20260112']
            ]
        ]
    );
}

echo $response;
client = Anthropic::Client.new
messages = [{ role: "user", content: "Hello, Claude" }]

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        pause_after_compaction: true
      }
    ]
  }
)

if response.stop_reason == :compaction
  messages << { role: "assistant", content: response.content }

  response = client.beta.messages.create(
    betas: ["compact-2026-01-12"],
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: messages,
    context_management: {
      edits: [{ type: "compact_20260112" }]
    }
  )
end

puts response

총 토큰 예산 강제하기

도구 사용 반복이 많은 긴 작업에서 모델이 작업할 때 총 토큰 소비가 크게 늘 수 있어요. pause_after_compaction을 컴팩션 카운터와 결합해 누적 사용량을 추정하고 예산에 도달하면 작업을 우아하게 마무리할 수 있어요.

이 예제는 SDK 언어에만 나타나요. 그 가치는 요청 주변의 예산 추적 로직이에요. 원시 요청은 트리거 구성의 trigger와 컴팩션 후 일시 정지의 pause_after_compaction을 결합해요.

client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
TRIGGER_THRESHOLD = 100_000
TOTAL_TOKEN_BUDGET = 3_000_000
n_compactions = 0

response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={
        "edits": [
            {
                "type": "compact_20260112",
                "trigger": {"type": "input_tokens", "value": TRIGGER_THRESHOLD},
                "pause_after_compaction": True,
            }
        ]
    },
)

if response.stop_reason == "compaction":
    n_compactions += 1
    messages.append({"role": "assistant", "content": response.content})

    # Estimate total tokens consumed; prompt wrap-up if over budget
    if n_compactions * TRIGGER_THRESHOLD >= TOTAL_TOKEN_BUDGET:
        messages.append(
            {
                "role": "user",
                "content": "Please wrap up your current work and summarize the final state.",
            }
        )
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];
const TRIGGER_THRESHOLD = 100_000;
const TOTAL_TOKEN_BUDGET = 3_000_000;
let compactionCount = 0;

const response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        trigger: { type: "input_tokens", value: TRIGGER_THRESHOLD },
        pause_after_compaction: true
      }
    ]
  }
});

if (response.stop_reason === "compaction") {
  compactionCount += 1;
  messages.push({ role: "assistant", content: response.content });

  // Estimate total tokens consumed; prompt wrap-up if over budget
  if (compactionCount * TRIGGER_THRESHOLD >= TOTAL_TOKEN_BUDGET) {
    messages.push({
      role: "user",
      content: "Please wrap up your current work and summarize the final state."
    });
  }
}
AnthropicClient client = new();
List<BetaMessageParam> messages = [new() { Role = Role.User, Content = "Hello, Claude" }];

const int TriggerThreshold = 100_000;
const int TotalTokenBudget = 3_000_000;
int compactionCount = 0;

var response = await client.Beta.Messages.Create(new()
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit
        {
            Trigger = new BetaInputTokensTrigger(TriggerThreshold),
            PauseAfterCompaction = true
        }]
    }
});

if (response.StopReason == BetaStopReason.Compaction)
{
    compactionCount += 1;
    messages.Add(new()
    {
        Role = Role.Assistant,
        Content = response.Content.Select(b => new BetaContentBlockParam(b.Json)).ToList()
    });

    // Estimate total tokens consumed; prompt wrap-up if over budget
    if (compactionCount * TriggerThreshold >= TotalTokenBudget)
    {
        messages.Add(new()
        {
            Role = Role.User,
            Content = "Please wrap up your current work and summarize the final state."
        });
    }
}

Console.WriteLine(response);
client := anthropic.NewClient()
messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}

const triggerThreshold = 100_000
const totalTokenBudget = 3_000_000
compactionCount := 0

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:     anthropic.ModelClaudeOpus5_5,
	MaxTokens: 4096,
	Messages:  messages,
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{
				Trigger:              anthropic.BetaInputTokensTriggerParam{Value: triggerThreshold},
				PauseAfterCompaction: anthropic.Bool(true),
			}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}

if response.StopReason == "compaction" {
	compactionCount++
	messages = append(messages, response.ToParam())

	// Estimate total tokens consumed; prompt wrap-up if over budget
	if compactionCount*triggerThreshold >= totalTokenBudget {
		messages = append(messages, anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Please wrap up your current work and summarize the final state.")))
	}
}

fmt.Println(response)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
import com.anthropic.models.beta.messages.BetaStopReason;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        long triggerThreshold = 100_000;
        long totalTokenBudget = 3_000_000;
        int compactionCount = 0;

        List<BetaMessageParam> messages = new ArrayList<>();
        messages.add(BetaMessageParam.builder()
            .role(BetaMessageParam.Role.USER)
            .content("Hello, Claude")
            .build());

        MessageCreateParams params = MessageCreateParams.builder()
            .addBeta("compact-2026-01-12")
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .messages(messages)
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder()
                    .trigger(BetaInputTokensTrigger.builder()
                        .value(triggerThreshold)
                        .build())
                    .pauseAfterCompaction(true)
                    .build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);

        if (response.stopReason().isPresent()
                && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
            compactionCount += 1;
            messages.add(response.toParam());

            // Estimate total tokens consumed; prompt wrap-up if over budget
            if (compactionCount * triggerThreshold >= totalTokenBudget) {
                messages.add(BetaMessageParam.builder()
                    .role(BetaMessageParam.Role.USER)
                    .content("Please wrap up your current work and summarize the final state.")
                    .build());
            }
        }

        System.out.println(response);
$client = new Client();

$triggerThreshold = 100_000;
$totalTokenBudget = 3_000_000;
$compactionCount = 0;

$messages = [['role' => 'user', 'content' => 'Hello, Claude']];

$response = $client->beta->messages->create(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            [
                'type' => 'compact_20260112',
                'trigger' => ['type' => 'input_tokens', 'value' => $triggerThreshold],
                'pause_after_compaction' => true
            ]
        ]
    ]
);

if ($response->stopReason === 'compaction') {
    $compactionCount += 1;
    $messages[] = ['role' => 'assistant', 'content' => $response->content];

    // Estimate total tokens consumed; prompt wrap-up if over budget
    if ($compactionCount * $triggerThreshold >= $totalTokenBudget) {
        $messages[] = [
            'role' => 'user',
            'content' => 'Please wrap up your current work and summarize the final state.'
        ];
    }
}
client = Anthropic::Client.new
messages = [{ role: "user", content: "Hello, Claude" }]
TRIGGER_THRESHOLD = 100_000
TOTAL_TOKEN_BUDGET = 3_000_000
compaction_count = 0

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [
      {
        type: "compact_20260112",
        trigger: { type: "input_tokens", value: TRIGGER_THRESHOLD },
        pause_after_compaction: true
      }
    ]
  }
)

if response.stop_reason == :compaction
  compaction_count += 1
  messages << { role: "assistant", content: response.content }

  # Estimate total tokens consumed; prompt wrap-up if over budget
  if compaction_count * TRIGGER_THRESHOLD >= TOTAL_TOKEN_BUDGET
    messages << {
      role: "user",
      content: "Please wrap up your current work and summarize the final state."
    }
  end
end

컴팩션 블록 다루기

컴팩션이 트리거되면 API는 어시스턴트 응답의 시작 부분에 compaction 블록을 반환해요.

긴 대화는 여러 컴팩션을 만들 수 있어요. 마지막 컴팩션 블록이 프롬프트의 최종 상태를 반영하고, 그 앞의 콘텐츠를 생성된 요약으로 대체해요.

{
  "content": [
    {
      "type": "compaction",
      "content": "Summary of the conversation: The user requested help building a web scraper..."
    },
    {
      "type": "text",
      "text": "Based on our conversation so far..."
    }
  ]
}

컴팩션 블록 다시 전달하기

짧아진 프롬프트로 대화를 계속하려면 이후 요청에서 compaction 블록을 API에 다시 전달해야 해요. 가장 간단한 방법은 전체 응답 콘텐츠를 메시지에 추가하는 것이에요:

# The response content, including the compaction block, must go back to the
# API as the assistant turn of the next request. Managing that message list
# doesn't translate well to a one-off shell command; see the CLI and SDK
# tabs for the full flow. First request:
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112"
        }
      ]
    }
  }'
ant beta:messages create \
  --beta compact-2026-01-12 \
  --transform content \
  --format jsonl <<'YAML' > content.json
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
YAML

# After receiving a response with a compaction block, append it as the
# assistant turn and continue the conversation
ant beta:messages create --beta compact-2026-01-12 <<YAML
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Hello, Claude
  - role: assistant
    content: $(cat content.json)
  - role: user
    content: Now add error handling
context_management:
  edits:
    - type: compact_20260112
YAML
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={"edits": [{"type": "compact_20260112"}]},
)
# After receiving a response with a compaction block
messages.append({"role": "assistant", "content": response.content})

# Continue the conversation
messages.append({"role": "user", "content": "Now add error handling"})

response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={"edits": [{"type": "compact_20260112"}]},
)
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];

const response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
});

// After receiving a response with a compaction block
messages.push({
  role: "assistant",
  content: response.content
});

// Continue the conversation
messages.push({ role: "user", content: "Now add error handling" });

const nextResponse = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
});
AnthropicClient client = new();

var messages = new List<BetaMessageParam>
{
    new() { Role = Role.User, Content = "Help me build a web scraper" }
};

var response = await client.Beta.Messages.Create(new()
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit()]
    }
});

messages.Add(new BetaMessageParam
{
    Role = Role.Assistant,
    Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList()
});

messages.Add(new BetaMessageParam { Role = Role.User, Content = "Now add error handling" });

var nextResponse = await client.Beta.Messages.Create(new()
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit()]
    }
});

Console.WriteLine(nextResponse);
client := anthropic.NewClient()

messages := []anthropic.BetaMessageParam{
	anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a web scraper")),
}

compactEdit := anthropic.BetaContextManagementConfigParam{
	Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
		{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
	},
}

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:             anthropic.ModelClaudeOpus5_5,
	MaxTokens:         4096,
	Messages:          messages,
	ContextManagement: compactEdit,
	Betas:             []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}

messages = append(messages, response.ToParam())

messages = append(messages, anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Now add error handling")))

nextResponse, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:             anthropic.ModelClaudeOpus5_5,
	MaxTokens:         4096,
	Messages:          messages,
	ContextManagement: compactEdit,
	Betas:             []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}

fmt.Println(nextResponse)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        // First request
        BetaMessage response = client.beta().messages().create(
            MessageCreateParams.builder()
                .addBeta("compact-2026-01-12")
                .model("claude-opus-5-5")
                .maxTokens(4096L)
                .addUserMessage("Help me build a web scraper")
                .contextManagement(BetaContextManagementConfig.builder()
                    .addEdit(BetaCompact20260112Edit.builder().build())
                    .build())
                .build());

        // After receiving a response with a compaction block, append the full
        // content (including compaction blocks) and continue the conversation
        BetaMessage nextResponse = client.beta().messages().create(
            MessageCreateParams.builder()
                .addBeta("compact-2026-01-12")
                .model("claude-opus-5-5")
                .maxTokens(4096L)
                .addUserMessage("Help me build a web scraper")
                .addMessage(response)
                .addUserMessage("Now add error handling")
                .contextManagement(BetaContextManagementConfig.builder()
                    .addEdit(BetaCompact20260112Edit.builder().build())
                    .build())
                .build());

        System.out.println(nextResponse);
$client = new Client();

$messages = [
    ['role' => 'user', 'content' => 'Help me build a web scraper']
];

$response = $client->beta->messages->create(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [['type' => 'compact_20260112']]
    ]
);

$messages[] = ['role' => 'assistant', 'content' => $response->content];

$messages[] = ['role' => 'user', 'content' => 'Now add error handling'];

$nextResponse = $client->beta->messages->create(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [['type' => 'compact_20260112']]
    ]
);

echo json_encode($nextResponse, JSON_PRETTY_PRINT), PHP_EOL;
client = Anthropic::Client.new

messages = [
  { role: "user", content: "Help me build a web scraper" }
]

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
)

messages << { role: "assistant", content: response.content }

messages << { role: "user", content: "Now add error handling" }

next_response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
)

puts next_response.content

Python에서는 이 페이지의 예제처럼 client.beta.messages를 사용해요. client.messages를 호출하면서 블록을 직접 직렬화하면 평범한 model_dump()가 compaction 블록에 text: null과 citations: null을 추가해요. 그러면 API가 400 오류(Extra inputs are not permitted)로 요청을 거부해요. 대신 to_dict()나 model_dump(exclude_none=True)를 사용하세요. 요약부터 계속하기가 요청 시 컴팩션에도 같은 조언을 줘요.

API가 compaction 블록을 받으면 그 앞의 모든 콘텐츠 블록은 무시돼요. 다음 중 하나를 할 수 있어요:

  • 목록에 원래 메시지를 유지하고 API가 컴팩션된 콘텐츠를 제거하도록 두기
  • 컴팩션된 메시지를 수동으로 버리고 컴팩션 블록부터만 포함하기

Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5에서 compaction 블록 이전의 thinking 블록은 이월되지 않아서, 요약이 모델이 그 이전 작업에 갖는 전부예요. 직접 instructions를 쓴다면 요약이 무엇을 유지해야 하는지 모델에 알려주세요. 컴팩션 요약에서 무엇을 보존할지 모델에 알리기를 보세요.

스트리밍

컴팩션 블록은 텍스트 블록과 다르게 스트리밍돼요. content_block_start 이벤트, 이어서 완전한 요약 콘텐츠를 담은 단일 content_block_delta(중간 스트리밍 없음), 그다음 content_block_stop 이벤트를 받아요.

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "stream": true,
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112"
        }
      ]
    }
  }'
ant beta:messages create \
  --stream \
  --beta compact-2026-01-12 \
  --format jsonl <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
YAML
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]

with client.beta.messages.stream(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    messages=messages,
    context_management={"edits": [{"type": "compact_20260112"}]},
) as stream:
    for event in stream:
        match event.type:
            case "content_block_start":
                block = event.content_block
                match block.type:
                    case "compaction":
                        print("Compaction started...")
                    case "text":
                        print("Text response started...")

            case "content_block_delta":
                delta = event.delta
                match delta.type:
                    case "compaction_delta":
                        print(f"Compaction complete: {len(delta.content or '')} chars")
                    case "text_delta":
                        print(delta.text, end="", flush=True)

    # Get the final accumulated message
    message = stream.get_final_message()
    messages.append({"role": "assistant", "content": message.content})
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];

const stream = await client.beta.messages.stream({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
});

for await (const event of stream) {
  switch (event.type) {
    case "content_block_start":
      switch (event.content_block.type) {
        case "compaction":
          console.log("Compaction started...");
          break;
        case "text":
          console.log("Text response started...");
          break;
      }
      break;
    case "content_block_delta":
      switch (event.delta.type) {
        case "compaction_delta":
          console.log(`Compaction complete: ${event.delta.content?.length ?? 0} chars`);
          break;
        case "text_delta":
          process.stdout.write(event.delta.text);
          break;
      }
      break;
  }
}

// Get the final accumulated message
const message = await stream.finalMessage();
messages.push({
  role: "assistant",
  content: message.content
});
var client = new AnthropicClient();
List<BetaMessageParam> messages = [new() { Role = Role.User, Content = "Hello" }];

var parameters = new MessageCreateParams
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit()]
    }
};

await foreach (var streamEvent in client.Beta.Messages.CreateStreaming(parameters))
{
    if (streamEvent.TryPickContentBlockStart(out var startEvent))
    {
        if (startEvent.ContentBlock.TryPickBetaCompaction(out _))
        {
            Console.WriteLine("Compaction started...");
        }
        else if (startEvent.ContentBlock.TryPickBetaText(out _))
        {
            Console.WriteLine("Text response started...");
        }
    }
    else if (streamEvent.TryPickContentBlockDelta(out var deltaEvent))
    {
        if (deltaEvent.Delta.TryPickCompaction(out var compactionDelta))
        {
            Console.WriteLine($"Compaction complete: {compactionDelta.Content?.Length ?? 0} chars");
        }
        else if (deltaEvent.Delta.TryPickText(out var textDelta))
        {
            Console.Write(textDelta.Text);
        }
    }
}
client := anthropic.NewClient()
messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}

stream := client.Beta.Messages.NewStreaming(context.TODO(), anthropic.BetaMessageNewParams{
	Model:     anthropic.ModelClaudeOpus5_5,
	MaxTokens: 4096,
	Messages:  messages,
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})

for stream.Next() {
	event := stream.Current()
	switch eventVariant := event.AsAny().(type) {
	case anthropic.BetaRawContentBlockStartEvent:
		switch eventVariant.ContentBlock.AsAny().(type) {
		case anthropic.BetaCompactionBlock:
			fmt.Println("Compaction started...")
		case anthropic.BetaTextBlock:
			fmt.Println("Text response started...")
		}
	case anthropic.BetaRawContentBlockDeltaEvent:
		switch deltaVariant := eventVariant.Delta.AsAny().(type) {
		case anthropic.BetaCompactionContentBlockDelta:
			fmt.Printf("Compaction complete: %d chars\n", len(deltaVariant.Content))
		case anthropic.BetaTextDelta:
			fmt.Print(deltaVariant.Text)
		}
	}
}
if err := stream.Err(); err != nil {
	log.Fatal(err)
}
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCreateParams params = MessageCreateParams.builder()
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .addBeta("compact-2026-01-12")
            .addUserMessage("Hello, Claude")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder().build())
                .build())
            .build();

        try (var streamResponse = client.beta().messages().createStreaming(params)) {
            streamResponse.stream().forEach(event -> {
                event.contentBlockStart().ifPresent(startEvent -> {
                    startEvent.contentBlock().compaction().ifPresent(c ->
                        System.out.println("Compaction started...")
                    );
                    startEvent.contentBlock().text().ifPresent(t ->
                        System.out.println("Text response started...")
                    );
                });

                event.contentBlockDelta().ifPresent(deltaEvent -> {
                    deltaEvent.delta().compaction().ifPresent(cd ->
                        System.out.println("Compaction complete: " + cd.content().map(String::length).orElse(0) + " chars")
                    );
                    deltaEvent.delta().text().ifPresent(td ->
                        System.out.print(td.text())
                    );
                });
            });
        }
use Anthropic\Beta\Messages\BetaCompactionBlock;
use Anthropic\Beta\Messages\BetaCompactionContentBlockDelta;
use Anthropic\Beta\Messages\BetaRawContentBlockDeltaEvent;
use Anthropic\Beta\Messages\BetaRawContentBlockStartEvent;
use Anthropic\Beta\Messages\BetaTextBlock;
use Anthropic\Beta\Messages\BetaTextDelta;

$client = new Client();
$messages = [['role' => 'user', 'content' => 'Hello, Claude']];

$stream = $client->beta->messages->createStream(
    maxTokens: 4096,
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            ['type' => 'compact_20260112']
        ]
    ]
);

foreach ($stream as $event) {
    switch (true) {
        case $event instanceof BetaRawContentBlockStartEvent:
            switch (true) {
                case $event->contentBlock instanceof BetaCompactionBlock:
                    echo "Compaction started...\n";
                    break;
                case $event->contentBlock instanceof BetaTextBlock:
                    echo "Text response started...\n";
                    break;
            }
            break;
        case $event instanceof BetaRawContentBlockDeltaEvent:
            switch (true) {
                case $event->delta instanceof BetaCompactionContentBlockDelta:
                    echo "Compaction complete: " . strlen($event->delta->content ?? '') . " chars\n";
                    break;
                case $event->delta instanceof BetaTextDelta:
                    echo $event->delta->text;
                    break;
            }
            break;
    }
}
client = Anthropic::Client.new
messages = [{ role: "user", content: "Hello, Claude" }]

stream = client.beta.messages.stream(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  messages: messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
)

stream.each do |event|
  case event
  when Anthropic::Models::BetaRawContentBlockStartEvent
    case event.content_block
    when Anthropic::Models::BetaCompactionBlock
      puts "Compaction started..."
    when Anthropic::Models::BetaTextBlock
      puts "Text response started..."
    end
  when Anthropic::Models::BetaRawContentBlockDeltaEvent
    delta = event.delta
    case delta
    when Anthropic::Models::BetaCompactionContentBlockDelta
      puts "Compaction complete: #{(delta.content || "").length} chars"
    when Anthropic::Models::BetaTextDelta
      print delta.text
    end
  end
end

프롬프트 캐싱

컴팩션은 프롬프트 캐싱과 잘 어울려요. 컴팩션 블록에 cache_control 브레이크포인트를 추가해 요약된 콘텐츠를 캐시할 수 있어요.

{
  "role": "assistant",
  "content": [
    {
      "type": "compaction",
      "content": "[summary text]",
      "cache_control": { "type": "ephemeral" }
    },
    {
      "type": "text",
      "text": "Based on our conversation..."
    }
  ]
}

시스템 프롬프트로 캐시 히트 최대화

컴팩션이 발생하면 요약은 캐시에 새로 써야 하는 새 콘텐츠가 돼요. 추가 캐시 브레이크포인트가 없으면 캐시된 시스템 프롬프트도 무효화되어 컴팩션 요약과 함께 다시 캐시되어야 해요.

캐시 히트율을 최대화하려면 시스템 프롬프트 끝에 cache_control 브레이크포인트를 추가해요. 이렇게 하면 시스템 프롬프트가 대화와 분리되어 캐시되어, 컴팩션이 발생할 때:

  • 시스템 프롬프트 캐시는 유효하게 유지되고 캐시에서 읽혀요
  • 컴팩션 요약만 새 캐시 항목으로 쓰면 돼요
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "system": [
      {
        "type": "text",
        "text": "You are a helpful coding assistant...",
        "cache_control": {
          "type": "ephemeral"
        }
      }
    ],
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112"
        }
      ]
    }
  }'
ant beta:messages create --beta compact-2026-01-12 <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
system:
  - type: text
    text: You are a helpful coding assistant...
    cache_control:
      type: ephemeral
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
YAML
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
response = client.beta.messages.create(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    max_tokens=4096,
    system=[
        {
            "type": "text",
            "text": "You are a helpful coding assistant...",
            "cache_control": {
                "type": "ephemeral"
            },  # Cache the system prompt separately
        }
    ],
    messages=messages,
    context_management={"edits": [{"type": "compact_20260112"}]},
)
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Hello, Claude" }
];

const response = await client.beta.messages.create({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  system: [
    {
      type: "text",
      text: "You are a helpful coding assistant...",
      cache_control: { type: "ephemeral" } // Cache the system prompt separately
    }
  ],
  messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
});
var client = new AnthropicClient();

var parameters = new MessageCreateParams
{
    Betas = ["compact-2026-01-12"],
    Model = "claude-opus-5-5",
    MaxTokens = 4096,
    System = new List<BetaTextBlockParam>
    {
        new()
        {
            Text = "You are a helpful coding assistant...",
            CacheControl = new BetaCacheControlEphemeral()
        }
    },
    Messages = [new() { Role = Role.User, Content = "Hello, Claude" }],
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit()]
    }
};

var response = await client.Beta.Messages.Create(parameters);
Console.WriteLine(response);
client := anthropic.NewClient()

response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
	Model:     anthropic.ModelClaudeOpus5_5,
	MaxTokens: 4096,
	System: []anthropic.BetaTextBlockParam{
		{
			Text:         "You are a helpful coding assistant...",
			CacheControl: anthropic.NewBetaCacheControlEphemeralParam(),
		},
	},
	Messages: []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))},
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}
fmt.Println(response)
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
import com.anthropic.models.beta.messages.BetaCacheControlEphemeral;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCreateParams params = MessageCreateParams.builder()
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .addBeta("compact-2026-01-12")
            .systemOfBetaTextBlockParams(List.of(
                BetaTextBlockParam.builder()
                    .text("You are a helpful coding assistant...")
                    .cacheControl(BetaCacheControlEphemeral.builder().build())
                    .build()
            ))
            .addUserMessage("Hello, Claude")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder().build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);
        System.out.println(response);
$client = new Client();

$response = $client->beta->messages->create(
    maxTokens: 4096,
    messages: [['role' => 'user', 'content' => 'Hello, Claude']],
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    system: [
        [
            'type' => 'text',
            'text' => 'You are a helpful coding assistant...',
            'cache_control' => [
                'type' => 'ephemeral'
            ]
        ]
    ],
    contextManagement: [
        'edits' => [
            ['type' => 'compact_20260112']
        ]
    ]
);

echo json_encode($response, JSON_PRETTY_PRINT), PHP_EOL;
client = Anthropic::Client.new

response = client.beta.messages.create(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  max_tokens: 4096,
  system: [
    {
      type: "text",
      text: "You are a helpful coding assistant...",
      cache_control: {
        type: "ephemeral"
      }
    }
  ],
  messages: [{ role: "user", content: "Hello, Claude" }],
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
)
puts response

이렇게 하면 대화 전반의 여러 컴팩션 이벤트에 걸쳐 긴 시스템 프롬프트가 캐시로 유지돼요.

사용량 이해하기

컴팩션은 추가 샘플링 단계를 필요로 하고, 이것이 요금 제한과 과금에 기여해요. API는 응답에서 자세한 사용량 정보를 반환해요:

{
  "usage": {
    "input_tokens": 23000,
    "output_tokens": 1000,
    "iterations": [
      {
        "type": "compaction",
        "input_tokens": 180000,
        "output_tokens": 3500
      },
      {
        "type": "message",
        "input_tokens": 23000,
        "output_tokens": 1000
      }
    ]
  }
}

iterations 배열은 각 샘플링 반복의 사용량을 보여줘요. 컴팩션이 발생하면 compaction 반복이 이어서 주요 message 반복보다 먼저 표시돼요. 이 예제에서 최상위 input_tokens와 output_tokens는 비컴팩션 반복이 하나뿐이라 message 반복과 정확히 일치해요. 마지막 반복의 토큰 수는 컴팩션 후의 유효 컨텍스트 크기를 반영해요.

참고: 최상위 input_tokens와 output_tokens는 컴팩션 반복 사용량을 포함하지 않아요. 모든 비컴팩션 반복의 합을 반영해요. 요청에 대해 소비되고 과금된 총 토큰을 계산하려면 usage.iterations 배열의 모든 항목을 합산하세요.

이전에 비용 추적이나 감사에 usage.input_tokens와 usage.output_tokens에 의존했다면, 컴팩션이 활성화되면 추적 로직을 usage.iterations 전체를 집계하도록 업데이트해야 해요. 컴팩션 베타가 활성화되면 컴팩션이 발생하지 않았더라도 모든 응답에 usage.iterations가 포함돼요. compaction 항목은 요청 중에 새 컴팩션이 트리거될 때만 나타나요. 이전 compaction 블록을 다시 적용하면 추가 컴팩션 비용이 발생하지 않고, 그 경우 최상위 사용량 필드는 정확하게 유지돼요.

다른 기능과 결합

서버 도구

서버 도구(예: 웹 검색)를 사용할 때 컴팩션 트리거는 각 샘플링 반복 시작 시 확인돼요. 트리거 임계값과 생성된 출력 양에 따라 단일 요청 안에서 컴팩션이 여러 번 발생할 수 있어요.

토큰 계산

토큰 계산 엔드포인트(/v1/messages/count_tokens)는 프롬프트의 기존 compaction 블록을 적용하지만 새 컴팩션은 트리거하지 않아요. 이전 컴팩션 이후의 유효 토큰 수를 확인할 때 사용해요:

curl https://api.anthropic.com/v1/messages/count_tokens \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "messages": [
      {
        "role": "user",
        "content": "Hello, Claude"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112"
        }
      ]
    }
  }'
CURRENT=$(ant beta:messages count-tokens \
  --beta compact-2026-01-12 \
  --transform input_tokens \
  --raw-output <<'YAML'
model: claude-opus-5-5
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
YAML
)

ORIGINAL=$(ant beta:messages count-tokens \
  --beta compact-2026-01-12 \
  --transform context_management.original_input_tokens \
  --raw-output <<'YAML'
model: claude-opus-5-5
messages:
  - role: user
    content: Hello, Claude
context_management:
  edits:
    - type: compact_20260112
YAML
)

printf 'Current tokens: %s\n' "$CURRENT"
printf 'Original tokens: %s\n' "$ORIGINAL"
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Hello, Claude"}]
count_response = client.beta.messages.count_tokens(
    betas=["compact-2026-01-12"],
    model="claude-opus-5-5",
    messages=messages,
    context_management={"edits": [{"type": "compact_20260112"}]},
)

print(f"Current tokens: {count_response.input_tokens}")
print(f"Original tokens: {count_response.context_management.original_input_tokens}")
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
  { role: "user", content: "Summarize the key points of our conversation so far." }
];

const countResponse = await client.beta.messages.countTokens({
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
});

console.log(`Current tokens: ${countResponse.input_tokens}`);
console.log(`Original tokens: ${countResponse.context_management!.original_input_tokens}`);
AnthropicClient client = new();
List<BetaMessageParam> messages = [new() { Role = Role.User, Content = "Hello" }];

var countParams = new MessageCountTokensParams
{
    Model = "claude-opus-5-5",
    Messages = messages,
    ContextManagement = new BetaContextManagementConfig
    {
        Edits = [new BetaCompact20260112Edit()]
    },
    Betas = ["compact-2026-01-12"]
};

var countResponse = await client.Beta.Messages.CountTokens(countParams);
Console.WriteLine($"Current tokens: {countResponse.InputTokens}");
Console.WriteLine($"Original tokens: {countResponse.ContextManagement?.OriginalInputTokens}");
client := anthropic.NewClient()
messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}

countResponse, err := client.Beta.Messages.CountTokens(context.TODO(), anthropic.BetaMessageCountTokensParams{
	Model:    anthropic.ModelClaudeOpus5_5,
	Messages: messages,
	ContextManagement: anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
		},
	},
	Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
})
if err != nil {
	log.Fatal(err)
}

fmt.Printf("Current tokens: %d\n", countResponse.InputTokens)
fmt.Printf("Original tokens: %d\n", countResponse.ContextManagement.OriginalInputTokens)
import com.anthropic.models.beta.messages.BetaMessageTokensCount;
import com.anthropic.models.beta.messages.MessageCountTokensParams;
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
// ...
        AnthropicClient client = AnthropicOkHttpClient.fromEnv();

        MessageCountTokensParams params = MessageCountTokensParams.builder()
            .model("claude-opus-5-5")
            .addUserMessage("Hello, Claude")
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder().build())
                .build())
            .addBeta("compact-2026-01-12")
            .build();

        BetaMessageTokensCount countResponse = client.beta().messages().countTokens(params);
        System.out.println("Current tokens: " + countResponse.inputTokens());
        System.out.println("Original tokens: " + countResponse.contextManagement().get().originalInputTokens());
$client = new Client();
$messages = [['role' => 'user', 'content' => 'Hello, Claude']];

$countResponse = $client->beta->messages->countTokens(
    messages: $messages,
    model: 'claude-opus-5-5',
    betas: ['compact-2026-01-12'],
    contextManagement: [
        'edits' => [
            ['type' => 'compact_20260112']
        ]
    ]
);

echo "Current tokens: " . $countResponse->inputTokens . "\n";
echo "Original tokens: " . $countResponse->contextManagement->originalInputTokens . "\n";
client = Anthropic::Client.new
messages = [{ role: "user", content: "Hello, Claude" }]

count_response = client.beta.messages.count_tokens(
  betas: ["compact-2026-01-12"],
  model: "claude-opus-5-5",
  messages: messages,
  context_management: {
    edits: [{ type: "compact_20260112" }]
  }
)

puts "Current tokens: #{count_response.input_tokens}"
puts "Original tokens: #{count_response.context_management.original_input_tokens}"

예제

컴팩션이 있는 긴 대화의 완전한 예제를 보여드릴게요:

# curl sends individual requests; maintain the messages array in the
# calling script. See the SDK tabs for the full chat() loop. Single-turn
# request shape:
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Help me build a Python web scraper"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112",
          "trigger": {
            "type": "input_tokens",
            "value": 100000
          }
        }
      ]
    }
  }'
# The CLI handles individual turns; maintain the messages array in the
# calling script. See the SDK tabs for the full chat() loop. Single-turn
# request shape:
ant beta:messages create \
  --beta compact-2026-01-12 \
  --transform 'content.#(type=="text").text' \
  --raw-output <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Help me build a Python web scraper
context_management:
  edits:
    - type: compact_20260112
      trigger:
        type: input_tokens
        value: 100000
YAML
client = anthropic.Anthropic()

messages: list[dict] = []


def chat(user_message: str) -> str:
    messages.append({"role": "user", "content": user_message})

    response = client.beta.messages.create(
        betas=["compact-2026-01-12"],
        model="claude-opus-5-5",
        max_tokens=4096,
        messages=messages,
        context_management={
            "edits": [
                {
                    "type": "compact_20260112",
                    "trigger": {"type": "input_tokens", "value": 100000},
                }
            ]
        },
    )

    # Append response (compaction blocks are automatically included)
    messages.append({"role": "assistant", "content": response.content})

    # Return the text content
    return next(block.text for block in response.content if block.type == "text")


# Run a long conversation
print(chat("Help me build a Python web scraper"))
print(chat("Add support for JavaScript-rendered pages"))
print(chat("Now add rate limiting and error handling"))
# Continue calling chat() for as long as the conversation needs
const client = new Anthropic();

const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [];

async function chat(userMessage: string): Promise<string> {
  messages.push({ role: "user", content: userMessage });

  const response = await client.beta.messages.create({
    betas: ["compact-2026-01-12"],
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages,
    context_management: {
      edits: [
        {
          type: "compact_20260112",
          trigger: { type: "input_tokens", value: 100000 }
        }
      ]
    }
  });

  // Append response (compaction blocks are automatically included)
  messages.push({ role: "assistant", content: response.content });

  // Return the text content
  const textBlock = response.content.find((block) => block.type === "text");
  return textBlock?.text ?? "";
}

// Run a long conversation
console.log(await chat("Help me build a Python web scraper"));
console.log(await chat("Add support for JavaScript-rendered pages"));
console.log(await chat("Now add rate limiting and error handling"));
// Continue calling chat() for as long as the conversation needs
AnthropicClient client = new();
List<BetaMessageParam> messages = new();

Console.WriteLine(await Chat(client, messages, "Help me build a Python web scraper"));
Console.WriteLine(await Chat(client, messages, "Add support for JavaScript-rendered pages"));
Console.WriteLine(await Chat(client, messages, "Now add rate limiting and error handling"));

static async Task<string> Chat(AnthropicClient client, List<BetaMessageParam> messages, string userMessage)
{
    messages.Add(new() { Role = Role.User, Content = userMessage });

    var parameters = new MessageCreateParams
    {
        Betas = ["compact-2026-01-12"],
        Model = "claude-opus-5-5",
        MaxTokens = 4096,
        Messages = messages,
        ContextManagement = new BetaContextManagementConfig
        {
            Edits = [new BetaCompact20260112Edit
            {
                Trigger = new BetaInputTokensTrigger(100000)
            }]
        }
    };

    var response = await client.Beta.Messages.Create(parameters);

    messages.Add(new()
    {
        Role = Role.Assistant,
        Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList()
    });

    return response.Content
        .Select(block => block.Value)
        .OfType<BetaTextBlock>()
        .Select(tb => tb.Text)
        .FirstOrDefault() ?? "";
}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/anthropics/anthropic-sdk-go"
)

var (
	client   = anthropic.NewClient()
	messages []anthropic.BetaMessageParam
)

func chat(userMessage string) string {
	messages = append(messages, anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock(userMessage)))

	response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
		Model:     anthropic.ModelClaudeOpus5_5,
		MaxTokens: 4096,
		Messages:  messages,
		ContextManagement: anthropic.BetaContextManagementConfigParam{
			Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
				{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{
					Trigger: anthropic.BetaInputTokensTriggerParam{Value: 100000},
				}},
			},
		},
		Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
	})
	if err != nil {
		log.Fatal(err)
	}

	messages = append(messages, response.ToParam())

	for _, block := range response.Content {
		if variant, ok := block.AsAny().(anthropic.BetaTextBlock); ok {
			return variant.Text
		}
	}
	return ""
}

func main() {
	fmt.Println(chat("Help me build a Python web scraper"))
	fmt.Println(chat("Add support for JavaScript-rendered pages"))
	fmt.Println(chat("Now add rate limiting and error handling"))
}
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
// ...
    private static final AnthropicClient client = AnthropicOkHttpClient.fromEnv();
    private static final List<BetaMessageParam> messages = new ArrayList<>();

    public static void main(String[] args) {
        System.out.println(chat("Help me build a Python web scraper"));
        System.out.println(chat("Add support for JavaScript-rendered pages"));
        System.out.println(chat("Now add rate limiting and error handling"));
    }

    private static String chat(String userMessage) {
        messages.add(BetaMessageParam.builder()
            .role(BetaMessageParam.Role.USER)
            .content(userMessage)
            .build());

        MessageCreateParams params = MessageCreateParams.builder()
            .addBeta("compact-2026-01-12")
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .messages(messages)
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder()
                    .trigger(BetaInputTokensTrigger.builder()
                        .value(100000L)
                        .build())
                    .build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);

        // Append response (compaction blocks are automatically included)
        messages.add(response.toParam());

        return response.content().stream()
            .filter(block -> block.text().isPresent())
            .map(block -> block.text().get().text())
            .findFirst()
            .orElse("");
    }
$client = new Client();
$messages = [];

function chat($client, &$messages, $userMessage) {
    $messages[] = ['role' => 'user', 'content' => $userMessage];

    $response = $client->beta->messages->create(
        maxTokens: 4096,
        messages: $messages,
        model: 'claude-opus-5-5',
        betas: ['compact-2026-01-12'],
        contextManagement: [
            'edits' => [
                [
                    'type' => 'compact_20260112',
                    'trigger' => ['type' => 'input_tokens', 'value' => 100000]
                ]
            ]
        ]
    );

    $messages[] = ['role' => 'assistant', 'content' => $response->content];

    foreach ($response->content as $block) {
        if ($block->type === 'text') {
            return $block->text;
        }
    }
    return '';
}

echo chat($client, $messages, "Help me build a Python web scraper") . "\n";
echo chat($client, $messages, "Add support for JavaScript-rendered pages") . "\n";
echo chat($client, $messages, "Now add rate limiting and error handling") . "\n";
client = Anthropic::Client.new
messages = []

def chat(client, messages, user_message)
  messages << { role: "user", content: user_message }

  response = client.beta.messages.create(
    betas: ["compact-2026-01-12"],
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: messages,
    context_management: {
      edits: [
        {
          type: "compact_20260112",
          trigger: { type: "input_tokens", value: 100000 }
        }
      ]
    }
  )

  messages << { role: "assistant", content: response.content }

  response.content.find { |block| block.type == :text }&.text || ""
end

puts chat(client, messages, "Help me build a Python web scraper")
puts chat(client, messages, "Add support for JavaScript-rendered pages")
puts chat(client, messages, "Now add rate limiting and error handling")

Claude Fable 5.1과 Claude Opus 5.5에서 컴팩션 블록 뒤에 다시 삽입하는 어시스턴트 턴에서 thinking과 redacted_thinking 블록을 제거하거나, thinking-binding-controls-2026-08-01 베타 헤더와 함께 thinking.block_binding.prefix_mismatch_behavior: "drop_block"을 보내세요. 이 블록들은 전체 기록이 있을 때 생성됐으므로 더 이상 대화 검사를 통과하지 못해요. 검사가 시행되는 곳에서는 계속 요청이 400 오류로 거부돼요. 보존된 텍스트와 도구 블록은 그대로 둬도 돼요. API가 전부 요약하게 하고 이전 턴을 다시 삽입하지 않으면 이를 피할 수 있어요.

pause_after_compaction을 사용해 이전 교환과 현재 사용자 메시지(총 세 메시지)를 요약하지 않고 원문 그대로 보존하는 예제를 보여드릴게요:

# curl sends individual requests; maintain the messages array in the
# calling script. See the SDK tabs for the full chat() loop with
# pause-and-preserve handling. Single-turn request shape:
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: compact-2026-01-12" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 4096,
    "messages": [
      {
        "role": "user",
        "content": "Help me build a Python web scraper"
      }
    ],
    "context_management": {
      "edits": [
        {
          "type": "compact_20260112",
          "trigger": {
            "type": "input_tokens",
            "value": 100000
          },
          "pause_after_compaction": true
        }
      ]
    }
  }'
# The CLI handles individual turns; maintain the messages array in the
# calling script. See the SDK tabs for the full chat() loop with
# pause-and-preserve handling. Single-turn request shape:
ant beta:messages create \
  --beta compact-2026-01-12 \
  --transform 'content.#(type=="text").text' \
  --raw-output <<'YAML'
model: claude-opus-5-5
max_tokens: 4096
messages:
  - role: user
    content: Help me build a Python web scraper
context_management:
  edits:
    - type: compact_20260112
      trigger:
        type: input_tokens
        value: 100000
      pause_after_compaction: true
YAML
from typing import Any

client = anthropic.Anthropic()

messages: list[dict[str, Any]] = []


def chat(user_message: str) -> str:
    messages.append({"role": "user", "content": user_message})

    response = client.beta.messages.create(
        betas=["compact-2026-01-12"],
        model="claude-opus-5-5",
        max_tokens=4096,
        messages=messages,
        context_management={
            "edits": [
                {
                    "type": "compact_20260112",
                    "trigger": {"type": "input_tokens", "value": 100000},
                    "pause_after_compaction": True,
                }
            ]
        },
    )

    # Check if compaction occurred and paused
    if response.stop_reason == "compaction":
        # Get the compaction block from the response
        compaction_block = response.content[0]

        # Preserve the prior exchange + current user message (3 messages)
        # by including them after the compaction block
        preserved_messages = messages[-3:] if len(messages) >= 3 else messages

        # Build new message list: compaction + preserved messages
        new_assistant_content = [compaction_block]
        messages_after_compaction = [
            {"role": "assistant", "content": new_assistant_content}
        ] + preserved_messages

        # Continue the request with the compacted context + preserved messages
        response = client.beta.messages.create(
            betas=["compact-2026-01-12"],
            model="claude-opus-5-5",
            max_tokens=4096,
            messages=messages_after_compaction,
            context_management={"edits": [{"type": "compact_20260112"}]},
        )

        # Update the message list to reflect the compaction
        messages.clear()
        messages.extend(messages_after_compaction)

    # Append the final response
    messages.append({"role": "assistant", "content": response.content})

    # Return the text content
    return next(block.text for block in response.content if block.type == "text")


# Run a long conversation
print(chat("Help me build a Python web scraper"))
print(chat("Add support for JavaScript-rendered pages"))
print(chat("Now add rate limiting and error handling"))
# Continue calling chat() for as long as the conversation needs
const client = new Anthropic();

let messages: Anthropic.Beta.Messages.BetaMessageParam[] = [];

async function chat(userMessage: string): Promise<string> {
  messages.push({ role: "user", content: userMessage });

  let response = await client.beta.messages.create({
    betas: ["compact-2026-01-12"],
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages,
    context_management: {
      edits: [
        {
          type: "compact_20260112",
          trigger: { type: "input_tokens", value: 100000 },
          pause_after_compaction: true
        }
      ]
    }
  });

  // Check if compaction occurred and paused
  if (response.stop_reason === "compaction") {
    // Get the compaction block from the response
    const compactionBlock = response.content[0];

    // Preserve the prior exchange + current user message (3 messages)
    // by including them after the compaction block
    const preservedMessages = messages.length >= 3 ? messages.slice(-3) : [...messages];

    // Build new message list: compaction + preserved messages
    const messagesAfterCompaction: Anthropic.Beta.Messages.BetaMessageParam[] = [
      { role: "assistant", content: [compactionBlock] },
      ...preservedMessages
    ];

    // Continue the request with the compacted context + preserved messages
    response = await client.beta.messages.create({
      betas: ["compact-2026-01-12"],
      model: "claude-opus-5-5",
      max_tokens: 4096,
      messages: messagesAfterCompaction,
      context_management: {
        edits: [{ type: "compact_20260112" }]
      }
    });

    // Update the message list to reflect the compaction
    messages = messagesAfterCompaction;
  }

  // Append the final response
  messages.push({ role: "assistant", content: response.content });

  // Return the text content
  const textBlock = response.content.find((block) => block.type === "text");
  return textBlock?.text ?? "";
}

// Run a long conversation
console.log(await chat("Help me build a Python web scraper"));
console.log(await chat("Add support for JavaScript-rendered pages"));
console.log(await chat("Now add rate limiting and error handling"));
// Continue calling chat() for as long as the conversation needs
AnthropicClient client = new();
List<BetaMessageParam> messages = new();

Console.WriteLine(await Chat("Help me build a Python web scraper"));
Console.WriteLine(await Chat("Add support for JavaScript-rendered pages"));
Console.WriteLine(await Chat("Now add rate limiting and error handling"));

async Task<string> Chat(string userMessage)
{
    messages.Add(new() { Role = Role.User, Content = userMessage });

    var response = await client.Beta.Messages.Create(new()
    {
        Betas = ["compact-2026-01-12"],
        Model = "claude-opus-5-5",
        MaxTokens = 4096,
        Messages = messages,
        ContextManagement = new BetaContextManagementConfig
        {
            Edits = [new BetaCompact20260112Edit
            {
                Trigger = new BetaInputTokensTrigger(100000),
                PauseAfterCompaction = true
            }]
        }
    });

    if (response.StopReason == BetaStopReason.Compaction)
    {
        if (!response.Content[0].TryPickCompaction(out _))
            throw new InvalidOperationException("Expected compaction block");

        var preserved = messages.Count >= 3
            ? messages.Skip(messages.Count - 3).ToList()
            : new List<BetaMessageParam>(messages);

        var messagesAfterCompaction = new List<BetaMessageParam>
        {
            new()
            {
                Role = Role.Assistant,
                Content = new List<BetaContentBlockParam> { new BetaContentBlockParam(response.Content[0].Json) }
            }
        };
        messagesAfterCompaction.AddRange(preserved);

        response = await client.Beta.Messages.Create(new()
        {
            Betas = ["compact-2026-01-12"],
            Model = "claude-opus-5-5",
            MaxTokens = 4096,
            Messages = messagesAfterCompaction,
            ContextManagement = new BetaContextManagementConfig
            {
                Edits = [new BetaCompact20260112Edit()]
            }
        });

        messages = messagesAfterCompaction;
    }

    messages.Add(new()
    {
        Role = Role.Assistant,
        Content = response.Content.Select(block => new BetaContentBlockParam(block.Json)).ToList()
    });

    return response.Content
        .Select(block => block.Value)
        .OfType<BetaTextBlock>()
        .Select(tb => tb.Text)
        .FirstOrDefault() ?? "";
}
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/anthropics/anthropic-sdk-go"
)

var (
	client   = anthropic.NewClient()
	messages []anthropic.BetaMessageParam
)

func chat(userMessage string) string {
	messages = append(messages, anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock(userMessage)))

	compactEdit := anthropic.BetaContextManagementConfigParam{
		Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
			{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{
				Trigger:              anthropic.BetaInputTokensTriggerParam{Value: 100000},
				PauseAfterCompaction: anthropic.Bool(true),
			}},
		},
	}

	response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
		Model:             anthropic.ModelClaudeOpus5_5,
		MaxTokens:         4096,
		Messages:          messages,
		ContextManagement: compactEdit,
		Betas:             []anthropic.AnthropicBeta{"compact-2026-01-12"},
	})
	if err != nil {
		log.Fatal(err)
	}

	if response.StopReason == "compaction" {
		compactionParam := response.Content[0].ToParam()

		var preserved []anthropic.BetaMessageParam
		if len(messages) >= 3 {
			preserved = messages[len(messages)-3:]
		} else {
			preserved = messages
		}

		messagesAfterCompaction := []anthropic.BetaMessageParam{
			{Role: anthropic.BetaMessageParamRoleAssistant, Content: []anthropic.BetaContentBlockParamUnion{compactionParam}},
		}
		messagesAfterCompaction = append(messagesAfterCompaction, preserved...)

		response, err = client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
			Model:     anthropic.ModelClaudeOpus5_5,
			MaxTokens: 4096,
			Messages:  messagesAfterCompaction,
			ContextManagement: anthropic.BetaContextManagementConfigParam{
				Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
					{OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
				},
			},
			Betas: []anthropic.AnthropicBeta{"compact-2026-01-12"},
		})
		if err != nil {
			log.Fatal(err)
		}

		messages = messagesAfterCompaction
	}

	messages = append(messages, response.ToParam())

	for _, block := range response.Content {
		if textBlock, ok := block.AsAny().(anthropic.BetaTextBlock); ok {
			return textBlock.Text
		}
	}
	return ""
}

func main() {
	fmt.Println(chat("Help me build a Python web scraper"))
	fmt.Println(chat("Add support for JavaScript-rendered pages"))
	fmt.Println(chat("Now add rate limiting and error handling"))
}
import com.anthropic.models.beta.messages.BetaContextManagementConfig;
import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
import com.anthropic.models.beta.messages.BetaStopReason;
// ...
    private static final AnthropicClient client = AnthropicOkHttpClient.fromEnv();
    private static final List<BetaMessageParam> messages = new ArrayList<>();

    public static String chat(String userMessage) {
        messages.add(BetaMessageParam.builder()
            .role(BetaMessageParam.Role.USER)
            .content(userMessage)
            .build());

        MessageCreateParams params = MessageCreateParams.builder()
            .addBeta("compact-2026-01-12")
            .model("claude-opus-5-5")
            .maxTokens(4096L)
            .messages(messages)
            .contextManagement(BetaContextManagementConfig.builder()
                .addEdit(BetaCompact20260112Edit.builder()
                    .trigger(BetaInputTokensTrigger.builder()
                        .value(100000L)
                        .build())
                    .pauseAfterCompaction(true)
                    .build())
                .build())
            .build();

        BetaMessage response = client.beta().messages().create(params);

        // Check if compaction occurred and paused
        if (response.stopReason().isPresent()
                && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
            // Preserve the prior exchange + current user message (3 messages)
            List<BetaMessageParam> preservedMessages = messages.size() >= 3
                ? new ArrayList<>(messages.subList(messages.size() - 3, messages.size()))
                : new ArrayList<>(messages);

            // Build new message list: compaction + preserved messages
            List<BetaMessageParam> messagesAfterCompaction = new ArrayList<>();
            messagesAfterCompaction.add(response.toParam());
            messagesAfterCompaction.addAll(preservedMessages);

            // Continue the request with the compacted context + preserved messages
            MessageCreateParams continueParams = MessageCreateParams.builder()
                .addBeta("compact-2026-01-12")
                .model("claude-opus-5-5")
                .maxTokens(4096L)
                .messages(messagesAfterCompaction)
                .contextManagement(BetaContextManagementConfig.builder()
                    .addEdit(BetaCompact20260112Edit.builder().build())
                    .build())
                .build();

            response = client.beta().messages().create(continueParams);

            // Update the message list to reflect the compaction
            messages.clear();
            messages.addAll(messagesAfterCompaction);
        }

        // Append the final response
        messages.add(response.toParam());

        return response.content().stream()
            .filter(block -> block.text().isPresent())
            .map(block -> block.text().get().text())
            .findFirst()
            .orElse("");
    }

    public static void main(String[] args) {
        System.out.println(chat("Help me build a Python web scraper"));
        System.out.println(chat("Add support for JavaScript-rendered pages"));
        System.out.println(chat("Now add rate limiting and error handling"));
    }
$client = new Client();
$messages = [];

function chat($client, &$messages, $userMessage) {
    $messages[] = ['role' => 'user', 'content' => $userMessage];

    $response = $client->beta->messages->create(
        maxTokens: 4096,
        messages: $messages,
        model: 'claude-opus-5-5',
        betas: ['compact-2026-01-12'],
        contextManagement: [
            'edits' => [
                [
                    'type' => 'compact_20260112',
                    'trigger' => ['type' => 'input_tokens', 'value' => 100000],
                    'pause_after_compaction' => true
                ]
            ]
        ]
    );

    if ($response->stopReason === 'compaction') {
        $compactionBlock = $response->content[0];

        $preserved = count($messages) >= 3
            ? array_slice($messages, -3)
            : $messages;

        $messagesAfterCompaction = array_merge(
            [['role' => 'assistant', 'content' => [$compactionBlock]]],
            $preserved
        );

        $response = $client->beta->messages->create(
            maxTokens: 4096,
            messages: $messagesAfterCompaction,
            model: 'claude-opus-5-5',
            betas: ['compact-2026-01-12'],
            contextManagement: [
                'edits' => [['type' => 'compact_20260112']]
            ]
        );

        $messages = $messagesAfterCompaction;
    }

    $messages[] = ['role' => 'assistant', 'content' => $response->content];

    foreach ($response->content as $block) {
        if ($block->type === 'text') {
            return $block->text;
        }
    }
    return '';
}

echo chat($client, $messages, "Help me build a Python web scraper") . "\n";
echo chat($client, $messages, "Add support for JavaScript-rendered pages") . "\n";
echo chat($client, $messages, "Now add rate limiting and error handling") . "\n";
client = Anthropic::Client.new
messages = []

def chat(client, messages, user_message)
  messages << { role: "user", content: user_message }

  response = client.beta.messages.create(
    betas: ["compact-2026-01-12"],
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: messages,
    context_management: {
      edits: [
        {
          type: "compact_20260112",
          trigger: { type: "input_tokens", value: 100000 },
          pause_after_compaction: true
        }
      ]
    }
  )

  if response.stop_reason == :compaction
    compaction_block = response.content[0]

    preserved = messages.length >= 3 ? messages[-3..-1] : messages.dup

    messages_after_compaction = [
      { role: "assistant", content: [compaction_block] }
    ] + preserved

    response = client.beta.messages.create(
      betas: ["compact-2026-01-12"],
      model: "claude-opus-5-5",
      max_tokens: 4096,
      messages: messages_after_compaction,
      context_management: {
        edits: [{ type: "compact_20260112" }]
      }
    )

    messages.clear
    messages.concat(messages_after_compaction)
  end

  messages << { role: "assistant", content: response.content }

  response.content.find { |block| block.type == :text }&.text || ""
end

puts chat(client, messages, "Help me build a Python web scraper")
puts chat(client, messages, "Add support for JavaScript-rendered pages")
puts chat(client, messages, "Now add rate limiting and error handling")

현재 제한 사항

  • 요약에도 같은 모델 사용: 요청에 지정한 모델이 요약에도 사용돼요. 요약에 다른(예: 더 저렴한) 모델을 사용할 옵션은 없어요.

  • 도구가 정의되면 컴팩션이 실패할 수 있음: 요청에 tools가 포함되면 모델이 내부 요약 단계 중에 요약을 쓰는 대신 도구를 호출할 때가 있어요. 이 경우 응답에 content: null인 compaction 블록이 포함돼요. 이를 막으려면 instructions를 모델에 도구를 호출하지 말라고 명시적으로 지시하는 프롬프트로 설정하세요. 예를 들어:

    Summarize the transcript inside <summary></summary> tags. Include relevant information in the summary for continuing the task in the next context window. Do not call any tools while writing this summary; respond with text only.
    

더 알아보기 (Learn more)