Follow Discord
Sweep 10 Nov 2026 · 02:18Z Build v2.1.322 539 read Stable v2.1.311 Latest v2.1.322 Next v2.1.322 Feeds RSS JSON llms.txt llms-full.txt Unofficial
One change · api

compaction-threshold changedbuild-with-claude/compaction-threshold

Recorded here
Lines+486added
Lines−438removed
From line 28 where the diff opens
First seen 21 Sep 2026 this site's first read of the page
Recorded edits26to this page, all time

The whole hunk

from line 28, old and new numbered
/
lines

The two sides of this change are more than 400 edits apart, too far apart to line up, so this is the differ's own diff of it and the words inside a line are not marked.

from line 28
2828 - claude-sonnet-4-6
2929 supportedPlatforms:
3030 Claude API: beta
31 Amazon Bedrock: beta
32 Amazon Bedrock (bedrock-runtime): beta
3133 Claude Platform on AWS: beta
32 Amazon Bedrock: beta
33 Amazon Bedrock (InvokeModel): beta
3434 Claude Models on Google Cloud (Google managed): beta
3535 Microsoft Foundry: beta
3636---
from line 219
219219 import com.anthropic.models.beta.messages.BetaContextManagementConfig;
220220 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
221221 // ...
222 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
223 
224 MessageCreateParams params = MessageCreateParams.builder()
225 .addBeta("compact-2026-01-12")
226 .model(Model.CLAUDE_OPUS_5_5)
227 .maxTokens(4096L)
228 .addUserMessage("Help me build a website")
229 .contextManagement(BetaContextManagementConfig.builder()
230 .addEdit(BetaCompact20260112Edit.builder().build())
231 .build())
232 .build();
233 
234 BetaMessage response = client.beta().messages().create(params);
235 
236 // Append the response (including any compaction block) to continue the conversation
237 // by including it in the next request's messages
238 System.out.println(response);
222 
223 void main() {
224 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
225 
226 MessageCreateParams params = MessageCreateParams.builder()
227 .addBeta("compact-2026-01-12")
228 .model(Model.CLAUDE_OPUS_5_5)
229 .maxTokens(4096L)
230 .addUserMessage("Help me build a website")
231 .contextManagement(BetaContextManagementConfig.builder()
232 .addEdit(BetaCompact20260112Edit.builder().build())
233 .build())
234 .build();
235 
236 BetaMessage response = client.beta().messages().create(params);
237 
238 // To continue the conversation, add response.toParam() (including any
239 // compaction block) to the next request's messages
240 System.out.println(response);
241 }
239242 ```
240243 
241244 ```php PHP
from line 316
313316 "messages": [
314317 {
315318 "role": "user",
316 "content": "Hello, Claude"
319 "content": "Help me build a website"
317320 }
318321 ],
319322 "context_management": {
from line 339
336339 max_tokens: 4096
337340 messages:
338341 - role: user
339 content: Hello, Claude
342 content: Help me build a website
340343 context_management:
341344 edits:
342345 - type: compact_20260112
from line 351
348351 
349352 ```python Python
350353 client = anthropic.Anthropic()
351 messages = [{"role": "user", "content": "Hello, Claude"}]
354 messages = [{"role": "user", "content": "Help me build a website"}]
352355 response = client.beta.messages.create(
353356 betas=["compact-2026-01-12"],
354357 model="claude-opus-5-5",
from line 371
368371 ```typescript TypeScript
369372 const client = new Anthropic();
370373 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
371 { role: "user", content: "Hello, Claude" }
374 { role: "user", content: "Help me build a website" }
372375 ];
373376 
374377 const response = await client.beta.messages.create({
from line 395
392395 
393396 ```csharp C#
394397 AnthropicClient client = new();
395 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Hello" }];
398 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Help me build a website" }];
396399 
397400 var parameters = new MessageCreateParams
398401 {
from line 418
415418 
416419 ```go Go
417420 client := anthropic.NewClient()
418 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}
421 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website"))}
419422 
420423 response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
421424 Model: anthropic.ModelClaudeOpus5_5,
from line 444
441444 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
442445 import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
443446 // ...
444 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
445 
446 MessageCreateParams params = MessageCreateParams.builder()
447 .model(Model.CLAUDE_OPUS_5_5)
448 .maxTokens(4096L)
449 .addBeta("compact-2026-01-12")
450 .addUserMessage("Hello, Claude")
451 .contextManagement(BetaContextManagementConfig.builder()
452 .addEdit(BetaCompact20260112Edit.builder()
453 .trigger(BetaInputTokensTrigger.builder()
454 .value(150000L)
455 .build())
447 
448 void main() {
449 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
450 
451 MessageCreateParams params = MessageCreateParams.builder()
452 .model(Model.CLAUDE_OPUS_5_5)
453 .maxTokens(4096L)
454 .addBeta("compact-2026-01-12")
455 .addUserMessage("Help me build a website")
456 .contextManagement(BetaContextManagementConfig.builder()
457 .addEdit(BetaCompact20260112Edit.builder()
458 .trigger(BetaInputTokensTrigger.builder()
459 .value(150000L)
456460 .build())
457461 .build())
458 .build();
459 
460 BetaMessage response = client.beta().messages().create(params);
461 System.out.println(response);
462 .build())
463 .build();
464 
465 BetaMessage response = client.beta().messages().create(params);
466 System.out.println(response);
467 }
462468 ```
463469 
464470 ```php PHP
465471 $client = new Client();
466 $messages = [['role' => 'user', 'content' => 'Hello, Claude']];
472 $messages = [['role' => 'user', 'content' => 'Help me build a website']];
467473 
468474 $message = $client->beta->messages->create(
469475 maxTokens: 4096,
from line 494
488494 
489495 ```ruby Ruby
490496 client = Anthropic::Client.new
491 messages = [{ role: "user", content: "Hello, Claude" }]
497 messages = [{ role: "user", content: "Help me build a website" }]
492498 
493499 response = client.beta.messages.create(
494500 betas: ["compact-2026-01-12"],
from line 519
513519 
514520### Custom summarization instructions
515521 
516The default summarization prompt varies by model. Each default instructs Claude to write a summary inside `<summary></summary>` tags with the information needed to continue the task in a future context window. For example, some models use the following prompt:
522The default summarization prompt varies by model. Each default instructs Claude to write a summary inside `<summary></summary>` tags with the information needed to continue the task in a future context window. For example, this is one of the default prompts:
517523 
518524```text wrap
519525You 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.
from line 540
534540 "messages": [
535541 {
536542 "role": "user",
537 "content": "Hello, Claude"
543 "content": "Help me build a website"
538544 }
539545 ],
540546 "context_management": {
from line 560
554560 max_tokens: 4096
555561 messages:
556562 - role: user
557 content: Hello, Claude
563 content: Help me build a website
558564 context_management:
559565 edits:
560566 - type: compact_20260112
from line 572
566572 
567573 ```python Python
568574 client = anthropic.Anthropic()
569 messages = [{"role": "user", "content": "Hello, Claude"}]
575 messages = [{"role": "user", "content": "Help me build a website"}]
570576 response = client.beta.messages.create(
571577 betas=["compact-2026-01-12"],
572578 model="claude-opus-5-5",
from line 592
586592 ```typescript TypeScript
587593 const client = new Anthropic();
588594 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
589 { role: "user", content: "Hello, Claude" }
595 { role: "user", content: "Help me build a website" }
590596 ];
591597 
592598 const response = await client.beta.messages.create({
from line 669
663669 import com.anthropic.models.beta.messages.BetaContextManagementConfig;
664670 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
665671 // ...
666 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
667 
668 MessageCreateParams params = MessageCreateParams.builder()
669 .addBeta("compact-2026-01-12")
670 .model(Model.CLAUDE_OPUS_5_5)
671 .maxTokens(4096L)
672 .addUserMessage("Help me build a Python web scraper")
673 .addAssistantMessage("I'll help you build a web scraper...")
674 .addUserMessage("Add support for JavaScript-rendered pages")
675 .contextManagement(BetaContextManagementConfig.builder()
676 .addEdit(BetaCompact20260112Edit.builder()
677 .instructions("Focus on preserving code snippets, variable names, and technical decisions.")
678 .build())
672 
673 void main() {
674 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
675 
676 MessageCreateParams params = MessageCreateParams.builder()
677 .addBeta("compact-2026-01-12")
678 .model(Model.CLAUDE_OPUS_5_5)
679 .maxTokens(4096L)
680 .addUserMessage("Help me build a Python web scraper")
681 .addAssistantMessage("I'll help you build a web scraper...")
682 .addUserMessage("Add support for JavaScript-rendered pages")
683 .contextManagement(BetaContextManagementConfig.builder()
684 .addEdit(BetaCompact20260112Edit.builder()
685 .instructions("Focus on preserving code snippets, variable names, and technical decisions.")
679686 .build())
680 .build();
681 
682 BetaMessage response = client.beta().messages().create(params);
683 System.out.println(response);
687 .build())
688 .build();
689 
690 BetaMessage response = client.beta().messages().create(params);
691 System.out.println(response);
692 }
684693 ```
685694 
686695 ```php PHP
from line 744
735744 ```
736745</CodeGroup>
737746 
738On Claude Fable 5.2, Claude Mythos 5.2, Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, a request with custom `instructions` summarizes from the visible conversation only: earlier thinking blocks are not part of the summarizer’s input.
747On some models, a request with custom `instructions` summarizes from the visible conversation only, without earlier thinking blocks. Those models are Claude Fable 5.2, Claude Mythos 5.2, Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5.
739748 
740749### Pausing after compaction
741750 
from line 755
746755<CodeGroup>
747756 ```bash cURL
748757 # pause_after_compaction stops the response right after the compaction
749 # summary so you can adjust the messages before continuing. The continue
750 # step doesn't translate well to a one-off shell command; see the SDK tabs
751 # for the full pause-and-continue flow. Single paused request:
758 # summary so you can adjust the messages before continuing. Continuing
759 # needs more logic than a one-off shell command. Single paused request:
752760 curl https://api.anthropic.com/v1/messages \
753761 -H "x-api-key: $ANTHROPIC_API_KEY" \
754762 -H "anthropic-version: 2026-10-21" \
from line 768
760768 "messages": [
761769 {
762770 "role": "user",
763 "content": "Hello, Claude"
771 "content": "Help me build a website"
764772 }
765773 ],
766774 "context_management": {
from line 784
776784 
777785 ```bash CLI
778786 # pause_after_compaction stops the response right after the compaction
779 # summary so you can adjust the messages before continuing. The continue
780 # step doesn't translate well to a one-off CLI command; see the SDK tabs
781 # for the full pause-and-continue flow. Single paused request:
782 ant beta:messages create --beta compact-2026-01-12 --format jsonl <<'YAML'
787 # summary so you can adjust the messages before continuing. Continuing
788 # needs more logic than a one-off CLI command. Single paused request:
789 ant beta:messages create --beta compact-2026-01-12 <<'YAML'
783790 model: claude-opus-5-5
784791 max_tokens: 4096
785792 messages:
786793 - role: user
787 content: Hello, Claude
794 content: Help me build a website
788795 context_management:
789796 edits:
790797 - type: compact_20260112
from line 801
794801 
795802 ```python Python
796803 client = anthropic.Anthropic()
797 messages = [{"role": "user", "content": "Hello, Claude"}]
804 messages = [{"role": "user", "content": "Help me build a website"}]
798805 response = client.beta.messages.create(
799806 betas=["compact-2026-01-12"],
800807 model="claude-opus-5-5",
from line 830
823830 ```typescript TypeScript
824831 const client = new Anthropic();
825832 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
826 { role: "user", content: "Hello, Claude" }
833 { role: "user", content: "Help me build a website" }
827834 ];
828835 
829836 let response = await client.beta.messages.create({
from line 873
866873 var client = new AnthropicClient();
867874 var messages = new List<BetaMessageParam>
868875 {
869 new BetaUserMessageParam { Content = "Hello, Claude" }
876 new BetaUserMessageParam { Content = "Help me build a website" }
870877 };
871878 
872879 var parameters = new MessageCreateParams
from line 920
913920 
914921 ```go Go
915922 client := anthropic.NewClient()
916 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}
923 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website"))}
917924 
918925 compactEdit := anthropic.BetaContextManagementConfigParam{
919926 Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
from line 968
961968 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
962969 import com.anthropic.models.beta.messages.BetaStopReason;
963970 // ...
964 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
965 
966 MessageCreateParams params = MessageCreateParams.builder()
971 
972 void main() {
973 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
974 
975 MessageCreateParams params = MessageCreateParams.builder()
976 .model(Model.CLAUDE_OPUS_5_5)
977 .maxTokens(4096L)
978 .addBeta("compact-2026-01-12")
979 .addUserMessage("Help me build a website")
980 .contextManagement(BetaContextManagementConfig.builder()
981 .addEdit(BetaCompact20260112Edit.builder()
982 .pauseAfterCompaction(true)
983 .build())
984 .build())
985 .build();
986 
987 BetaMessage response = client.beta().messages().create(params);
988 
989 // Check if compaction triggered a pause
990 if (response.stopReason().isPresent()
991 && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
992 // Append the compaction block and continue the request
993 // by building a new request with the compacted context
994 MessageCreateParams continueParams = MessageCreateParams.builder()
967995 .model(Model.CLAUDE_OPUS_5_5)
968996 .maxTokens(4096L)
969997 .addBeta("compact-2026-01-12")
970998 .addUserMessage("Help me build a website")
999 .addMessage(response)
9711000 .contextManagement(BetaContextManagementConfig.builder()
972 .addEdit(BetaCompact20260112Edit.builder()
973 .pauseAfterCompaction(true)
974 .build())
1001 .addEdit(BetaCompact20260112Edit.builder().build())
9751002 .build())
9761003 .build();
9771004 
978 BetaMessage response = client.beta().messages().create(params);
979 
980 // Check if compaction triggered a pause
981 if (response.stopReason().isPresent()
982 && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
983 // Append the compaction block and continue the request
984 // by building a new request with the compacted context
985 MessageCreateParams continueParams = MessageCreateParams.builder()
986 .model(Model.CLAUDE_OPUS_5_5)
987 .maxTokens(4096L)
988 .addBeta("compact-2026-01-12")
989 .addUserMessage("Help me build a website")
990 .addMessage(response)
991 .contextManagement(BetaContextManagementConfig.builder()
992 .addEdit(BetaCompact20260112Edit.builder().build())
993 .build())
994 .build();
995 
996 response = client.beta().messages().create(continueParams);
997 }
998 
999 System.out.println(response);
1005 response = client.beta().messages().create(continueParams);
1006 }
1007 
1008 System.out.println(response);
1009 }
10001010 ```
10011011 
10021012 ```php PHP
10031013 $client = new Client();
1004 $messages = [['role' => 'user', 'content' => 'Hello, Claude']];
1014 $messages = [['role' => 'user', 'content' => 'Help me build a website']];
10051015 
10061016 $response = $client->beta->messages->create(
10071017 maxTokens: 4096,
10081018 messages: $messages,
1009 model: 'claude-opus-5-5',
1019 model: Model::CLAUDE_OPUS_5_5,
10101020 betas: ['compact-2026-01-12'],
10111021 contextManagement: [
10121022 'edits' => [
from line 1037
10271037 $response = $client->beta->messages->create(
10281038 maxTokens: 4096,
10291039 messages: $messages,
1030 model: 'claude-opus-5-5',
1040 model: Model::CLAUDE_OPUS_5_5,
10311041 betas: ['compact-2026-01-12'],
10321042 contextManagement: [
10331043 'edits' => [
from line 1052
10421052 
10431053 ```ruby Ruby
10441054 client = Anthropic::Client.new
1045 messages = [{ role: "user", content: "Hello, Claude" }]
1055 messages = [{ role: "user", content: "Help me build a website" }]
10461056 
10471057 response = client.beta.messages.create(
10481058 betas: ["compact-2026-01-12"],
from line 1093
10831093 
10841094When a model works on long tasks with many tool-use iterations, total token consumption can grow significantly. You can combine `pause_after_compaction` with a compaction counter to estimate cumulative usage and gracefully conclude the task once a budget is reached.
10851095 
1086This example appears in the SDK languages only: its value is the budget-tracking logic around the request. The raw request combines the `trigger` from [Trigger configuration](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#trigger-configuration) with `pause_after_compaction` from [Pausing after compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#pausing-after-compaction).
1087 
1088<CodeGroup exclude="shell">
1096The request combines the `trigger` from [Trigger configuration](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#trigger-configuration) with `pause_after_compaction` from [Pausing after compaction](https://platform.claude.com/docs/en/build-with-claude/compaction-threshold#pausing-after-compaction).
1097 
1098<CodeGroup exclude="shell:cURL, shell:CLI">
1099 <CodeGroupItem language="cURL">
1100 This workflow needs more logic than a single shell command. Use the Anthropic SDK to run it.
1101 </CodeGroupItem>
1102 
1103 <CodeGroupItem language="CLI">
1104 This workflow needs more logic than a single shell command. Use the Anthropic SDK to run it.
1105 </CodeGroupItem>
1106 
10891107 ```python Python
10901108 client = anthropic.Anthropic()
1091 messages = [{"role": "user", "content": "Hello, Claude"}]
1109 messages = [{"role": "user", "content": "Help me build a website"}]
10921110 TRIGGER_THRESHOLD = 100_000
10931111 TOTAL_TOKEN_BUDGET = 3_000_000
10941112 n_compactions = 0
from line 1144
11261144 ```typescript TypeScript
11271145 const client = new Anthropic();
11281146 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
1129 { role: "user", content: "Hello, Claude" }
1147 { role: "user", content: "Help me build a website" }
11301148 ];
11311149 const TRIGGER_THRESHOLD = 100_000;
11321150 const TOTAL_TOKEN_BUDGET = 3_000_000;
from line 1182
11641182 
11651183 ```csharp C#
11661184 AnthropicClient client = new();
1167 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Hello, Claude" }];
1185 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Help me build a website" }];
11681186 
11691187 const int TriggerThreshold = 100_000;
11701188 const int TotalTokenBudget = 3_000_000;
from line 1227
12091227 
12101228 ```go Go
12111229 client := anthropic.NewClient()
1212 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}
1230 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website"))}
12131231 
12141232 const triggerThreshold = 100_000
12151233 const totalTokenBudget = 3_000_000
from line 1270
12521270 import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
12531271 import com.anthropic.models.beta.messages.BetaStopReason;
12541272 // ...
1255 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
1256 
1257 long triggerThreshold = 100_000;
1258 long totalTokenBudget = 3_000_000;
1259 int compactionCount = 0;
1260 
1261 List<BetaMessageParam> messages = new ArrayList<>();
1262 messages.add(BetaMessageParam.ofUser("Hello, Claude"));
1263 
1264 MessageCreateParams params = MessageCreateParams.builder()
1265 .addBeta("compact-2026-01-12")
1266 .model(Model.CLAUDE_OPUS_5_5)
1267 .maxTokens(4096L)
1268 .messages(messages)
1269 .contextManagement(BetaContextManagementConfig.builder()
1270 .addEdit(BetaCompact20260112Edit.builder()
1271 .trigger(BetaInputTokensTrigger.builder()
1272 .value(triggerThreshold)
1273 .build())
1274 .pauseAfterCompaction(true)
1273 
1274 void main() {
1275 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
1276 
1277 long triggerThreshold = 100_000;
1278 long totalTokenBudget = 3_000_000;
1279 int compactionCount = 0;
1280 
1281 List<BetaMessageParam> messages = new ArrayList<>();
1282 messages.add(BetaMessageParam.ofUser("Help me build a website"));
1283 
1284 MessageCreateParams params = MessageCreateParams.builder()
1285 .addBeta("compact-2026-01-12")
1286 .model(Model.CLAUDE_OPUS_5_5)
1287 .maxTokens(4096L)
1288 .messages(messages)
1289 .contextManagement(BetaContextManagementConfig.builder()
1290 .addEdit(BetaCompact20260112Edit.builder()
1291 .trigger(BetaInputTokensTrigger.builder()
1292 .value(triggerThreshold)
12751293 .build())
1294 .pauseAfterCompaction(true)
12761295 .build())
1277 .build();
1278 
1279 BetaMessage response = client.beta().messages().create(params);
1280 
1281 if (response.stopReason().isPresent()
1282 && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
1283 compactionCount += 1;
1284 messages.add(response.toParam());
1285 
1286 // Estimate total tokens consumed; prompt wrap-up if over budget
1287 if (compactionCount * triggerThreshold >= totalTokenBudget) {
1288 messages.add(BetaMessageParam.ofUser(
1289 "Please wrap up your current work and summarize the final state."));
1290 }
1296 .build())
1297 .build();
1298 
1299 BetaMessage response = client.beta().messages().create(params);
1300 
1301 if (response.stopReason().isPresent()
1302 && response.stopReason().get().equals(BetaStopReason.COMPACTION)) {
1303 compactionCount += 1;
1304 messages.add(response.toParam());
1305 
1306 // Estimate total tokens consumed; prompt wrap-up if over budget
1307 if (compactionCount * triggerThreshold >= totalTokenBudget) {
1308 messages.add(BetaMessageParam.ofUser(
1309 "Please wrap up your current work and summarize the final state."));
12911310 }
1292 
1293 System.out.println(response);
1311 }
1312 
1313 System.out.println(response);
1314 }
12941315 ```
12951316 
12961317 ```php PHP
from line 1321
13001321 $totalTokenBudget = 3_000_000;
13011322 $compactionCount = 0;
13021323 
1303 $messages = [['role' => 'user', 'content' => 'Hello, Claude']];
1324 $messages = [['role' => 'user', 'content' => 'Help me build a website']];
13041325 
13051326 $response = $client->beta->messages->create(
13061327 maxTokens: 4096,
13071328 messages: $messages,
1308 model: 'claude-opus-5-5',
1329 model: Model::CLAUDE_OPUS_5_5,
13091330 betas: ['compact-2026-01-12'],
13101331 contextManagement: [
13111332 'edits' => [
from line 1355
13341355 
13351356 ```ruby Ruby
13361357 client = Anthropic::Client.new
1337 messages = [{ role: "user", content: "Hello, Claude" }]
1358 messages = [{ role: "user", content: "Help me build a website" }]
13381359 TRIGGER_THRESHOLD = 100_000
13391360 TOTAL_TOKEN_BUDGET = 3_000_000
13401361 compaction_count = 0
from line 1418
13971418 
13981419<CodeGroup exclude="shell:cURL, shell:CLI">
13991420 <CodeGroupItem language="cURL">
1400 This workflow needs more logic than a single shell command. Use the [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
1421 This workflow needs more logic than a single shell command. Use the [Anthropic SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
14011422 </CodeGroupItem>
14021423 
14031424 <CodeGroupItem language="CLI">
1404 This workflow needs more logic than a single shell command. Use the [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
1425 This workflow needs more logic than a single shell command. Use the [Anthropic SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
14051426 </CodeGroupItem>
14061427 
1407 ```python Python
1408 client = anthropic.Anthropic()
1409 messages = [{"role": "user", "content": "Hello, Claude"}]
1410 response = client.beta.messages.create(
1411 betas=["compact-2026-01-12"],
1412 model="claude-opus-5-5",
1413 max_tokens=4096,
1414 messages=messages,
1415 context_management={"edits": [{"type": "compact_20260112"}]},
1416 )
1417 # After receiving a response with a compaction block
1418 messages.append({"role": "assistant", "content": response.content})
1419 
1420 # Continue the conversation
1421 messages.append({"role": "user", "content": "Now add error handling"})
1422 
1423 response = client.beta.messages.create(
1424 betas=["compact-2026-01-12"],
1425 model="claude-opus-5-5",
1426 max_tokens=4096,
1427 messages=messages,
1428 context_management={"edits": [{"type": "compact_20260112"}]},
1429 )
1430 ```
1428 <CodeGroupItem>
1429 ```python Python
1430 client = anthropic.Anthropic()
1431 messages = [{"role": "user", "content": "Help me build a website"}]
1432 response = client.beta.messages.create(
1433 betas=["compact-2026-01-12"],
1434 model="claude-opus-5-5",
1435 max_tokens=4096,
1436 messages=messages,
1437 context_management={"edits": [{"type": "compact_20260112"}]},
1438 )
1439 # After receiving a response with a compaction block
1440 messages.append({"role": "assistant", "content": response.content})
1441 
1442 # Continue the conversation
1443 messages.append({"role": "user", "content": "Now add error handling"})
1444 
1445 response = client.beta.messages.create(
1446 betas=["compact-2026-01-12"],
1447 model="claude-opus-5-5",
1448 max_tokens=4096,
1449 messages=messages,
1450 context_management={"edits": [{"type": "compact_20260112"}]},
1451 )
1452 ```
1453 
1454 In Python, use `client.beta.messages`, as the samples on this page do. If you call `client.messages` and serialize blocks yourself, a plain `model_dump()` adds `text: null` and `citations: null` to the `compaction` block. The API then rejects the request with a 400 error (`Extra inputs are not permitted`). Use `to_dict()` or `model_dump(exclude_none=True)` instead.
1455 </CodeGroupItem>
14311456 
14321457 ```typescript TypeScript
14331458 const client = new Anthropic();
14341459 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
1435 { role: "user", content: "Hello, Claude" }
1460 { role: "user", content: "Help me build a website" }
14361461 ];
14371462 
14381463 const response = await client.beta.messages.create({
from line 1578
15531578 import com.anthropic.models.beta.messages.BetaContextManagementConfig;
15541579 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
15551580 // ...
1556 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
1557 
1558 // First request
1559 BetaMessage response = client.beta().messages().create(
1560 MessageCreateParams.builder()
1561 .addBeta("compact-2026-01-12")
1562 .model(Model.CLAUDE_OPUS_5_5)
1563 .maxTokens(4096L)
1564 .addUserMessage("Help me build a web scraper")
1565 .contextManagement(BetaContextManagementConfig.builder()
1566 .addEdit(BetaCompact20260112Edit.builder().build())
1567 .build())
1568 .build());
1569 
1570 // After receiving a response with a compaction block, append the full
1571 // content (including compaction blocks) and continue the conversation
1572 BetaMessage nextResponse = client.beta().messages().create(
1573 MessageCreateParams.builder()
1574 .addBeta("compact-2026-01-12")
1575 .model(Model.CLAUDE_OPUS_5_5)
1576 .maxTokens(4096L)
1577 .addUserMessage("Help me build a web scraper")
1578 .addMessage(response)
1579 .addUserMessage("Now add error handling")
1580 .contextManagement(BetaContextManagementConfig.builder()
1581 .addEdit(BetaCompact20260112Edit.builder().build())
1582 .build())
1583 .build());
1584 
1585 System.out.println(nextResponse);
1581 
1582 void main() {
1583 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
1584 
1585 // First request
1586 BetaMessage response = client.beta().messages().create(
1587 MessageCreateParams.builder()
1588 .addBeta("compact-2026-01-12")
1589 .model(Model.CLAUDE_OPUS_5_5)
1590 .maxTokens(4096L)
1591 .addUserMessage("Help me build a web scraper")
1592 .contextManagement(BetaContextManagementConfig.builder()
1593 .addEdit(BetaCompact20260112Edit.builder().build())
1594 .build())
1595 .build());
1596 
1597 // After receiving a response with a compaction block, append the full
1598 // content (including compaction blocks) and continue the conversation
1599 BetaMessage nextResponse = client.beta().messages().create(
1600 MessageCreateParams.builder()
1601 .addBeta("compact-2026-01-12")
1602 .model(Model.CLAUDE_OPUS_5_5)
1603 .maxTokens(4096L)
1604 .addUserMessage("Help me build a web scraper")
1605 .addMessage(response)
1606 .addUserMessage("Now add error handling")
1607 .contextManagement(BetaContextManagementConfig.builder()
1608 .addEdit(BetaCompact20260112Edit.builder().build())
1609 .build())
1610 .build());
1611 
1612 System.out.println(nextResponse);
1613 }
15861614 ```
15871615 
15881616 ```php PHP
from line 1623
15951623 $response = $client->beta->messages->create(
15961624 maxTokens: 4096,
15971625 messages: $messages,
1598 model: 'claude-opus-5-5',
1626 model: Model::CLAUDE_OPUS_5_5,
15991627 betas: ['compact-2026-01-12'],
16001628 contextManagement: [
16011629 'edits' => [['type' => 'compact_20260112']]
from line 1637
16091637 $nextResponse = $client->beta->messages->create(
16101638 maxTokens: 4096,
16111639 messages: $messages,
1612 model: 'claude-opus-5-5',
1640 model: Model::CLAUDE_OPUS_5_5,
16131641 betas: ['compact-2026-01-12'],
16141642 contextManagement: [
16151643 'edits' => [['type' => 'compact_20260112']]
from line 1681
16531681 puts next_response.content
16541682 ```
16551683</CodeGroup>
1656 
1657In Python, use `client.beta.messages`, as the samples on this page do. If you call `client.messages` and serialize blocks yourself, a plain `model_dump()` adds `text: null` and `citations: null` to the `compaction` block. The API then rejects the request with a 400 error (`Extra inputs are not permitted`). Use `to_dict()` or `model_dump(exclude_none=True)` instead. [Continue from the summary](https://platform.claude.com/docs/en/build-with-claude/compaction-on-demand#continue-from-the-summary) gives the same advice for on-demand compaction.
16581684 
16591685When the API receives a `compaction` block, all content blocks before it are ignored. You can either:
16601686 
from line 1709
16831709 "messages": [
16841710 {
16851711 "role": "user",
1686 "content": "Hello, Claude"
1712 "content": "Help me build a website"
16871713 }
16881714 ],
16891715 "context_management": {
from line 1731
17051731 max_tokens: 4096
17061732 messages:
17071733 - role: user
1708 content: Hello, Claude
1734 content: Help me build a website
17091735 context_management:
17101736 edits:
17111737 - type: compact_20260112
from line 1740
17141740 
17151741 ```python Python
17161742 client = anthropic.Anthropic()
1717 messages = [{"role": "user", "content": "Hello, Claude"}]
1743 messages = [{"role": "user", "content": "Help me build a website"}]
17181744 
17191745 with client.beta.messages.stream(
17201746 betas=["compact-2026-01-12"],
from line 1775
17491775 ```typescript TypeScript
17501776 const client = new Anthropic();
17511777 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
1752 { role: "user", content: "Hello, Claude" }
1778 { role: "user", content: "Help me build a website" }
17531779 ];
17541780 
17551781 const stream = await client.beta.messages.stream({
from line 1823
17971823 
17981824 ```csharp C#
17991825 var client = new AnthropicClient();
1800 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Hello" }];
1826 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Help me build a website" }];
18011827 
18021828 var parameters = new MessageCreateParams
18031829 {
from line 1866
18401866 
18411867 ```go Go
18421868 client := anthropic.NewClient()
1843 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}
1869 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website"))}
18441870 
18451871 stream := client.Beta.Messages.NewStreaming(context.TODO(), anthropic.BetaMessageNewParams{
18461872 Model: anthropic.ModelClaudeOpus5_5,
from line 1908
18821908 import com.anthropic.models.beta.messages.BetaContextManagementConfig;
18831909 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
18841910 // ...
1885 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
1886 
1887 MessageCreateParams params = MessageCreateParams.builder()
1888 .model(Model.CLAUDE_OPUS_5_5)
1889 .maxTokens(4096L)
1890 .addBeta("compact-2026-01-12")
1891 .addUserMessage("Hello, Claude")
1892 .contextManagement(BetaContextManagementConfig.builder()
1893 .addEdit(BetaCompact20260112Edit.builder().build())
1894 .build())
1895 .build();
1896 
1897 try (var streamResponse = client.beta().messages().createStreaming(params)) {
1898 streamResponse.stream().forEach(event -> {
1899 event.contentBlockStart().ifPresent(startEvent -> {
1900 startEvent.contentBlock().compaction().ifPresent(compactionBlock ->
1901 System.out.println("Compaction started...")
1902 );
1903 startEvent.contentBlock().text().ifPresent(textBlock ->
1904 System.out.println("Text response started...")
1905 );
1906 });
1907 
1908 event.contentBlockDelta().ifPresent(deltaEvent -> {
1909 deltaEvent.delta().compaction().ifPresent(compactionDelta ->
1910 System.out.println("Compaction complete: " + compactionDelta.content().map(String::length).orElse(0) + " chars")
1911 );
1912 deltaEvent.delta().text().ifPresent(textDelta ->
1913 System.out.print(textDelta.text())
1914 );
1915 });
1916 });
1917 }
1911 
1912 void main() {
1913 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
1914 
1915 MessageCreateParams params = MessageCreateParams.builder()
1916 .model(Model.CLAUDE_OPUS_5_5)
1917 .maxTokens(4096L)
1918 .addBeta("compact-2026-01-12")
1919 .addUserMessage("Help me build a website")
1920 .contextManagement(BetaContextManagementConfig.builder()
1921 .addEdit(BetaCompact20260112Edit.builder().build())
1922 .build())
1923 .build();
1924 
1925 try (var streamResponse = client.beta().messages().createStreaming(params)) {
1926 streamResponse.stream().forEach(event -> {
1927 switch (event.type().value()) {
1928 case CONTENT_BLOCK_START -> {
1929 var block = event.asContentBlockStart().contentBlock();
1930 switch (block.type().value()) {
1931 case COMPACTION -> System.out.println("Compaction started...");
1932 case TEXT -> System.out.println("Text response started...");
1933 default -> {}
1934 }
1935 }
1936 case CONTENT_BLOCK_DELTA -> {
1937 var delta = event.asContentBlockDelta().delta();
1938 switch (delta.type().value()) {
1939 case COMPACTION_DELTA -> System.out.println("Compaction complete: " + delta.asCompaction().content().map(String::length).orElse(0) + " chars");
1940 case TEXT_DELTA -> System.out.print(delta.asText().text());
1941 default -> {}
1942 }
1943 }
1944 default -> {}
1945 }
1946 });
1947 }
1948 }
19181949 ```
19191950 
19201951 ```php PHP
from line 1958
19271958 use Anthropic\Messages\Model;
19281959 
19291960 $client = new Client();
1930 $messages = [['role' => 'user', 'content' => 'Hello, Claude']];
1961 $messages = [['role' => 'user', 'content' => 'Help me build a website']];
19311962 
19321963 $stream = $client->beta->messages->createStream(
19331964 maxTokens: 4096,
from line 2000
19692000 
19702001 ```ruby Ruby
19712002 client = Anthropic::Client.new
1972 messages = [{ role: "user", content: "Hello, Claude" }]
2003 messages = [{ role: "user", content: "Help me build a website" }]
19732004 
19742005 stream = client.beta.messages.stream(
19752006 betas: ["compact-2026-01-12"],
from line 2086
20552086 "messages": [
20562087 {
20572088 "role": "user",
2058 "content": "Hello, Claude"
2089 "content": "Help me build a website"
20592090 }
20602091 ],
20612092 "context_management": {
from line 2110
20792110 type: ephemeral
20802111 messages:
20812112 - role: user
2082 content: Hello, Claude
2113 content: Help me build a website
20832114 context_management:
20842115 edits:
20852116 - type: compact_20260112
from line 2119
20882119 
20892120 ```python Python
20902121 client = anthropic.Anthropic()
2091 messages = [{"role": "user", "content": "Hello, Claude"}]
2122 messages = [{"role": "user", "content": "Help me build a website"}]
20922123 response = client.beta.messages.create(
20932124 betas=["compact-2026-01-12"],
20942125 model="claude-opus-5-5",
from line 2141
21102141 ```typescript TypeScript
21112142 const client = new Anthropic();
21122143 const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
2113 { role: "user", content: "Hello, Claude" }
2144 { role: "user", content: "Help me build a website" }
21142145 ];
21152146 
21162147 const response = await client.beta.messages.create({
from line 2178
21472178 CacheControl = new BetaCacheControlEphemeral()
21482179 }
21492180 },
2150 Messages = [new BetaUserMessageParam { Content = "Hello, Claude" }],
2181 Messages = [new BetaUserMessageParam { Content = "Help me build a website" }],
21512182 ContextManagement = new BetaContextManagementConfig
21522183 {
21532184 Edits = [new BetaCompact20260112Edit()]
from line 2201
21702201 CacheControl: anthropic.NewBetaCacheControlEphemeralParam(),
21712202 },
21722203 },
2173 Messages: []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))},
2204 Messages: []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website"))},
21742205 ContextManagement: anthropic.BetaContextManagementConfigParam{
21752206 Edits: []anthropic.BetaContextManagementConfigEditUnionParam{
21762207 {OfCompact20260112: &anthropic.BetaCompact20260112EditParam{}},
from line 2220
21892220 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
21902221 import com.anthropic.models.beta.messages.BetaCacheControlEphemeral;
21912222 // ...
2192 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
2193 
2194 MessageCreateParams params = MessageCreateParams.builder()
2195 .model(Model.CLAUDE_OPUS_5_5)
2196 .maxTokens(4096L)
2197 .addBeta("compact-2026-01-12")
2198 .systemOfBetaTextBlockParams(List.of(
2199 BetaTextBlockParam.builder()
2200 .text("You are a helpful coding assistant...")
2201 .cacheControl(BetaCacheControlEphemeral.builder().build())
2202 .build()
2203 ))
2204 .addUserMessage("Hello, Claude")
2205 .contextManagement(BetaContextManagementConfig.builder()
2206 .addEdit(BetaCompact20260112Edit.builder().build())
2207 .build())
2208 .build();
2209 
2210 BetaMessage response = client.beta().messages().create(params);
2211 System.out.println(response);
2223 
2224 void main() {
2225 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
2226 
2227 MessageCreateParams params = MessageCreateParams.builder()
2228 .model(Model.CLAUDE_OPUS_5_5)
2229 .maxTokens(4096L)
2230 .addBeta("compact-2026-01-12")
2231 .systemOfBetaTextBlockParams(List.of(
2232 BetaTextBlockParam.builder()
2233 .text("You are a helpful coding assistant...")
2234 .cacheControl(BetaCacheControlEphemeral.builder().build())
2235 .build()
2236 ))
2237 .addUserMessage("Help me build a website")
2238 .contextManagement(BetaContextManagementConfig.builder()
2239 .addEdit(BetaCompact20260112Edit.builder().build())
2240 .build())
2241 .build();
2242 
2243 BetaMessage response = client.beta().messages().create(params);
2244 System.out.println(response);
2245 }
22122246 ```
22132247 
22142248 ```php PHP
from line 2250
22162250 
22172251 $response = $client->beta->messages->create(
22182252 maxTokens: 4096,
2219 messages: [['role' => 'user', 'content' => 'Hello, Claude']],
2253 messages: [['role' => 'user', 'content' => 'Help me build a website']],
22202254 model: Model::CLAUDE_OPUS_5_5,
22212255 betas: ['compact-2026-01-12'],
22222256 system: [
from line 2288
22542288 }
22552289 }
22562290 ],
2257 messages: [{ role: "user", content: "Hello, Claude" }],
2291 messages: [{ role: "user", content: "Help me build a website" }],
22582292 context_management: {
22592293 edits: [{ type: "compact_20260112" }]
22602294 }
from line 2329
22952329<Note>
22962330 The top-level `input_tokens` and `output_tokens` do not include compaction iteration usage. They reflect the sum of all non-compaction iterations. To calculate total tokens consumed and billed for a request, sum across all entries in the `usage.iterations` array.
22972331 
2298 If you previously relied on `usage.input_tokens` and `usage.output_tokens` for cost tracking or auditing, you’ll need to update your tracking logic to aggregate across `usage.iterations` when compaction is enabled. With the compaction beta enabled, every response includes `usage.iterations`, even if no compaction occurred. A `compaction` entry appears only when a new compaction is triggered during the request. Re-applying a previous `compaction` block incurs no additional compaction cost, and the top-level usage fields remain accurate in that case.
2332 To track cost or audit usage when compaction is enabled, aggregate across `usage.iterations` instead of reading only `usage.input_tokens` and `usage.output_tokens`. With the compaction beta enabled, every response includes `usage.iterations`, even if no compaction occurred. A `compaction` entry appears only when a new compaction is triggered during the request. Re-applying a previous `compaction` block incurs no additional compaction cost, and the top-level usage fields remain accurate in that case.
22992333</Note>
23002334 
23012335## Combining with other features
from line 2354
23202354 "messages": [
23212355 {
23222356 "role": "user",
2323 "content": "Hello, Claude"
2357 "content": "Help me build a website"
23242358 }
23252359 ],
23262360 "context_management": {
from line 2372
23382372 model: claude-opus-5-5
23392373 messages:
23402374 - role: user
2341 content: Hello, Claude
2375 content: Help me build a website
23422376 context_management:
23432377 edits:
23442378 - type: compact_20260112
from line 2381
23472381 
23482382 ```python Python
23492383 client = anthropic.Anthropic()
2350 messages = [{"role": "user", "content": "Hello, Claude"}]
2384 messages = [{"role": "user", "content": "Help me build a website"}]
23512385 count_response = client.beta.messages.count_tokens(
23522386 betas=["compact-2026-01-12"],
23532387 model="claude-opus-5-5",
from line 2414
23802414 
23812415 ```csharp C#
23822416 AnthropicClient client = new();
2383 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Hello" }];
2417 List<BetaMessageParam> messages = [new BetaUserMessageParam { Content = "Help me build a website" }];
23842418 
23852419 var countParams = new MessageCountTokensParams
23862420 {
from line 2434
24002434 
24012435 ```go Go
24022436 client := anthropic.NewClient()
2403 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Hello, Claude"))}
2437 messages := []anthropic.BetaMessageParam{anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Help me build a website"))}
24042438 
24052439 countResponse, err := client.Beta.Messages.CountTokens(context.TODO(), anthropic.BetaMessageCountTokensParams{
24062440 Model: anthropic.ModelClaudeOpus5_5,
from line 2460
24262460 import com.anthropic.models.beta.messages.BetaContextManagementConfig;
24272461 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
24282462 // ...
2429 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
2430 
2431 MessageCountTokensParams params = MessageCountTokensParams.builder()
2432 .model(Model.CLAUDE_OPUS_5_5)
2433 .addUserMessage("Hello, Claude")
2434 .contextManagement(BetaContextManagementConfig.builder()
2435 .addEdit(BetaCompact20260112Edit.builder().build())
2436 .build())
2437 .addBeta("compact-2026-01-12")
2438 .build();
2439 
2440 BetaMessageTokensCount countResponse = client.beta().messages().countTokens(params);
2441 System.out.println("Current tokens: " + countResponse.inputTokens());
2442 System.out.println("Original tokens: " + countResponse.contextManagement().get().originalInputTokens());
2463 
2464 void main() {
2465 AnthropicClient client = AnthropicOkHttpClient.fromEnv();
2466 
2467 MessageCountTokensParams params = MessageCountTokensParams.builder()
2468 .model(Model.CLAUDE_OPUS_5_5)
2469 .addUserMessage("Help me build a website")
2470 .contextManagement(BetaContextManagementConfig.builder()
2471 .addEdit(BetaCompact20260112Edit.builder().build())
2472 .build())
2473 .addBeta("compact-2026-01-12")
2474 .build();
2475 
2476 BetaMessageTokensCount countResponse = client.beta().messages().countTokens(params);
2477 System.out.println("Current tokens: " + countResponse.inputTokens());
2478 System.out.println("Original tokens: " + countResponse.contextManagement().get().originalInputTokens());
2479 }
24432480 ```
24442481 
24452482 ```php PHP
24462483 $client = new Client();
2447 $messages = [['role' => 'user', 'content' => 'Hello, Claude']];
2484 $messages = [['role' => 'user', 'content' => 'Help me build a website']];
24482485 
24492486 $countResponse = $client->beta->messages->countTokens(
24502487 messages: $messages,
2451 model: 'claude-opus-5-5',
2488 model: Model::CLAUDE_OPUS_5_5,
24522489 betas: ['compact-2026-01-12'],
24532490 contextManagement: [
24542491 'edits' => [
from line 2500
24632500 
24642501 ```ruby Ruby
24652502 client = Anthropic::Client.new
2466 messages = [{ role: "user", content: "Hello, Claude" }]
2503 messages = [{ role: "user", content: "Help me build a website" }]
24672504 
24682505 count_response = client.beta.messages.count_tokens(
24692506 betas: ["compact-2026-01-12"],
from line 2522
24852522 
24862523<CodeGroup exclude="shell:cURL, shell:CLI">
24872524 <CodeGroupItem language="cURL">
2488 This workflow needs more logic than a single shell command. Use the [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
2525 This workflow needs more logic than a single shell command. Use the [Anthropic SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
24892526 </CodeGroupItem>
24902527 
24912528 <CodeGroupItem language="CLI">
2492 This workflow needs more logic than a single shell command. Use the [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
2529 This workflow needs more logic than a single shell command. Use the [Anthropic SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
24932530 </CodeGroupItem>
24942531 
24952532 ```python Python
from line 2705
26682705 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
26692706 import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
26702707 // ...
2671 private static final AnthropicClient client = AnthropicOkHttpClient.fromEnv();
2672 private static final List<BetaMessageParam> messages = new ArrayList<>();
2673 
2674 public static void main(String[] args) {
2675 System.out.println(chat("Briefly, help me build a Python web scraper"));
2676 System.out.println(chat("Briefly, add support for JavaScript-rendered pages"));
2677 System.out.println(chat("Briefly, add rate limiting and error handling"));
2678 }
2679 
2680 private static String chat(String userMessage) {
2681 messages.add(BetaMessageParam.ofUser(userMessage));
2682 
2683 MessageCreateParams params = MessageCreateParams.builder()
2684 .addBeta("compact-2026-01-12")
2685 .model(Model.CLAUDE_OPUS_5_5)
2686 .maxTokens(4096L)
2687 .messages(messages)
2688 .contextManagement(BetaContextManagementConfig.builder()
2689 .addEdit(BetaCompact20260112Edit.builder()
2690 .trigger(BetaInputTokensTrigger.builder()
2691 .value(100000L)
2692 .build())
2708 final AnthropicClient client = AnthropicOkHttpClient.fromEnv();
2709 final List<BetaMessageParam> messages = new ArrayList<>();
2710 
2711 void main() {
2712 System.out.println(chat("Briefly, help me build a Python web scraper"));
2713 System.out.println(chat("Briefly, add support for JavaScript-rendered pages"));
2714 System.out.println(chat("Briefly, add rate limiting and error handling"));
2715 }
2716 
2717 String chat(String userMessage) {
2718 messages.add(BetaMessageParam.ofUser(userMessage));
2719 
2720 MessageCreateParams params = MessageCreateParams.builder()
2721 .addBeta("compact-2026-01-12")
2722 .model(Model.CLAUDE_OPUS_5_5)
2723 .maxTokens(4096L)
2724 .messages(messages)
2725 .contextManagement(BetaContextManagementConfig.builder()
2726 .addEdit(BetaCompact20260112Edit.builder()
2727 .trigger(BetaInputTokensTrigger.builder()
2728 .value(100000L)
26932729 .build())
26942730 .build())
2695 .build();
2696 
2697 BetaMessage response = client.beta().messages().create(params);
2698 
2699 // Append response (compaction blocks are automatically included)
2700 messages.add(response.toParam());
2701 
2702 return response.content().stream()
2703 .filter(block -> block.text().isPresent())
2704 .map(block -> block.text().get().text())
2705 .findFirst()
2706 .orElse("");
2707 }
2731 .build())
2732 .build();
2733 
2734 BetaMessage response = client.beta().messages().create(params);
2735 
2736 // Append response (compaction blocks are automatically included)
2737 messages.add(response.toParam());
2738 
2739 return response.content().stream()
2740 .flatMap(block -> block.text().stream())
2741 .map(textBlock -> textBlock.text())
2742 .findFirst()
2743 .orElse("");
2744 }
27082745 ```
27092746 
27102747 ```php PHP
from line 2755
27182755 $response = $client->beta->messages->create(
27192756 maxTokens: 4096,
27202757 messages: $messages,
2721 model: 'claude-opus-5-5',
2758 model: Model::CLAUDE_OPUS_5_5,
27222759 betas: ['compact-2026-01-12'],
27232760 contextManagement: [
27242761 'edits' => [
from line 2770
27332770 $messages[] = ['role' => 'assistant', 'content' => $response->content];
27342771 
27352772 foreach ($response->content as $block) {
2736 if ($block->type === 'text') {
2773 if ($block instanceof \Anthropic\Beta\Messages\BetaTextBlock) {
27372774 return $block->text;
27382775 }
27392776 }
from line 2815
27782815 ```
27792816</CodeGroup>
27802817 
2781On Claude Fable 5.2, Claude Mythos 5.2, Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5, thinking blocks in any assistant turn you reinsert after the compaction block fail the [prefix check](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation), because they were produced when the full history was present. Strip the `thinking` and `redacted_thinking` blocks from those turns. Alternatively, send `thinking.block_binding.prefix_mismatch_behavior: "drop_block"` with the `thinking-binding-controls-2026-08-01` [beta header](https://platform.claude.com/docs/en/api/beta-headers). The preserved text and tool blocks can stay as they are. Letting the API summarize everything, without reinserting earlier turns, avoids this. On Claude Sonnet 5.5 and Claude Haiku 5.5, `block_binding` works only with `thinking: {"type": "adaptive"}`. With any other thinking setting on those models, strip the blocks.
2818When you reinsert an earlier assistant turn after the compaction block, that turn’s thinking blocks fail the [prefix check](https://platform.claude.com/docs/en/build-with-claude/thinking#preserved-in-conversation) on some models. Those models are Claude Fable 5.2, Claude Mythos 5.2, Claude Fable 5.1, Claude Mythos 5.1, Claude Opus 5.5, Claude Sonnet 5.5, and Claude Haiku 5.5. The blocks fail because they were produced when the full history was present.
2819 
2820To avoid the failure, do one of the following:
2821 
2822* **Strip the blocks:** Remove the `thinking` and `redacted_thinking` blocks from the turns you reinsert. The preserved text and tool blocks can stay as they are.
2823* **Have the API drop the blocks:** Send `thinking.block_binding.prefix_mismatch_behavior: "drop_block"`. This needs the `thinking-binding-controls-2026-08-01` beta header (see [Beta headers](https://platform.claude.com/docs/en/api/beta-headers)).
2824* **Don’t reinsert earlier turns:** Let the API summarize everything.
2825 
2826On Claude Sonnet 5.5 and Claude Haiku 5.5, `block_binding` works only with `thinking: {"type": "adaptive"}`. With any other thinking setting on those two models, strip the blocks.
27822827 
27832828Here’s an example that uses `pause_after_compaction` to preserve the prior exchange and the current user message (three messages total) instead of summarizing them. It keeps their text and tool blocks unchanged, removes the `thinking` and `redacted_thinking` blocks from the preserved assistant turn, and drops that turn if nothing else is left:
27842829 
27852830<CodeGroup exclude="shell:cURL, shell:CLI">
27862831 <CodeGroupItem language="cURL">
2787 This workflow needs more logic than a single shell command. Use the [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
2832 This workflow needs more logic than a single shell command. Use the [Anthropic SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
27882833 </CodeGroupItem>
27892834 
27902835 <CodeGroupItem language="CLI">
2791 This workflow needs more logic than a single shell command. Use the [Claude SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
2836 This workflow needs more logic than a single shell command. Use the [Anthropic SDK](https://platform.claude.com/docs/en/cli-sdks-libraries/overview) to run it.
27922837 </CodeGroupItem>
27932838 
27942839 ```python Python
from line 2887
28422887 else message
28432888 for message in messages[-3:]
28442889 ]
2845 preserved_messages = [m for m in preserved_messages if m["content"]]
2890 preserved_messages = [
2891 message for message in preserved_messages if message["content"]
2892 ]
28462893 
28472894 # Build new message list: compaction + preserved messages
28482895 new_assistant_content = [compaction_block]
from line 3225
31783225 import com.anthropic.models.beta.messages.BetaCompact20260112Edit;
31793226 import com.anthropic.models.beta.messages.BetaInputTokensTrigger;
31803227 // ...
3181 private static final AnthropicClient client = AnthropicOkHttpClient.fromEnv();
3182 private static final List<BetaMessageParam> messages = new ArrayList<>();
3183 
3184 public static String chat(String userMessage) {
3185 messages.add(BetaMessageParam.ofUser(userMessage));
3186 
3187 MessageCreateParams params = MessageCreateParams.builder()
3228 final AnthropicClient client = AnthropicOkHttpClient.fromEnv();
3229 final List<BetaMessageParam> messages = new ArrayList<>();
3230 
3231 String chat(String userMessage) {
3232 messages.add(BetaMessageParam.ofUser(userMessage));
3233 
3234 MessageCreateParams params = MessageCreateParams.builder()
3235 .addBeta("compact-2026-01-12")
3236 .model(Model.CLAUDE_OPUS_5_5)
3237 .maxTokens(4096L)
3238 .messages(messages)
3239 .contextManagement(BetaContextManagementConfig.builder()
3240 .addEdit(BetaCompact20260112Edit.builder()
3241 .trigger(BetaInputTokensTrigger.builder()
3242 .value(100000L)
3243 .build())
3244 .pauseAfterCompaction(true)
3245 .build())
3246 .build())
3247 .build();
3248 
3249 BetaMessage response = client.beta().messages().create(params);
3250 
3251 // Look for the compaction block, not the stop reason:
3252 // stopReason() is REFUSAL, not COMPACTION, if the summary was blocked
3253 var compactionBlock = response.content().stream()
3254 .flatMap(block -> block.compaction().stream())
3255 .findFirst();
3256 
3257 // Replace the history only if a summary was generated
3258 if (compactionBlock.flatMap(block -> block.content()).isPresent()) {
3259 // Preserve the prior exchange + current user message (3 messages),
3260 // without thinking blocks; an assistant turn left empty is dropped
3261 List<BetaMessageParam> preservedMessages = new ArrayList<>();
3262 for (BetaMessageParam message : messages.subList(Math.max(0, messages.size() - 3), messages.size())) {
3263 if (message.isAssistant() && message.asAssistant().content().isContentBlockParams()) {
3264 var keptBlocks = message.asAssistant().content().asContentBlockParams().stream()
3265 .filter(block -> !block.isThinking() && !block.isRedactedThinking())
3266 .toList();
3267 if (keptBlocks.isEmpty()) {
3268 continue;
3269 }
3270 message = BetaMessageParam.ofAssistantOfContentBlockParams(keptBlocks);
3271 }
3272 preservedMessages.add(message);
3273 }
3274 
3275 // Build new message list: compaction + preserved messages
3276 List<BetaMessageParam> messagesAfterCompaction = new ArrayList<>();
3277 messagesAfterCompaction.add(response.toParam());
3278 messagesAfterCompaction.addAll(preservedMessages);
3279 
3280 // Update the message list to reflect the compaction
3281 messages.clear();
3282 messages.addAll(messagesAfterCompaction);
3283 }
3284 
3285 if (compactionBlock.isPresent()) {
3286 // Continue the request, with the full history if there is no summary
3287 MessageCreateParams continueParams = MessageCreateParams.builder()
31883288 .addBeta("compact-2026-01-12")
31893289 .model(Model.CLAUDE_OPUS_5_5)
31903290 .maxTokens(4096L)
31913291 .messages(messages)
31923292 .contextManagement(BetaContextManagementConfig.builder()
3193 .addEdit(BetaCompact20260112Edit.builder()
3194 .trigger(BetaInputTokensTrigger.builder()
3195 .value(100000L)
3196 .build())
3197 .pauseAfterCompaction(true)
3198 .build())
3293 .addEdit(BetaCompact20260112Edit.builder().build())
31993294 .build())
32003295 .build();
32013296 
3202 BetaMessage response = client.beta().messages().create(params);
3203 
3204 // Look for the compaction block, not the stop reason:
3205 // stopReason() is REFUSAL, not COMPACTION, if the summary was blocked
3206 var compactionBlock = response.content().stream()
3207 .flatMap(block -> block.compaction().stream())
3208 .findFirst();
3209 
3210 // Replace the history only if a summary was generated
3211 if (compactionBlock.flatMap(block -> block.content()).isPresent()) {
3212 // Preserve the prior exchange + current user message (3 messages),
3213 // without thinking blocks; an assistant turn left empty is dropped
3214 List<BetaMessageParam> preservedMessages = new ArrayList<>();
3215 for (BetaMessageParam message : messages.subList(Math.max(0, messages.size() - 3), messages.size())) {
3216 if (message.isAssistant() && message.asAssistant().content().isContentBlockParams()) {
3217 var keptBlocks = message.asAssistant().content().asContentBlockParams().stream()
3218 .filter(block -> !block.isThinking() && !block.isRedactedThinking())
3219 .toList();
3220 if (keptBlocks.isEmpty()) {
3221 continue;
3222 }
3223 message = BetaMessageParam.ofAssistantOfContentBlockParams(keptBlocks);
3224 }
3225 preservedMessages.add(message);
3226 }
3227 
3228 // Build new message list: compaction + preserved messages
3229 List<BetaMessageParam> messagesAfterCompaction = new ArrayList<>();
3230 messagesAfterCompaction.add(response.toParam());
3231 messagesAfterCompaction.addAll(preservedMessages);
3232 
3233 // Update the message list to reflect the compaction
3234 messages.clear();
3235 messages.addAll(messagesAfterCompaction);
3236 }
3237 
3238 if (compactionBlock.isPresent()) {
3239 // Continue the request, with the full history if there is no summary
3240 MessageCreateParams continueParams = MessageCreateParams.builder()
3241 .addBeta("compact-2026-01-12")
3242 .model(Model.CLAUDE_OPUS_5_5)
3243 .maxTokens(4096L)
3244 .messages(messages)
3245 .contextManagement(BetaContextManagementConfig.builder()
3246 .addEdit(BetaCompact20260112Edit.builder().build())
3247 .build())
3248 .build();
3249 
3250 response = client.beta().messages().create(continueParams);
3251 }
3252 
3253 // Append the final response
3254 messages.add(response.toParam());
3255 
3256 return response.content().stream()
3257 .filter(block -> block.text().isPresent())
3258 .map(block -> block.text().get().text())
3259 .findFirst()
3260 .orElse("");
3261 }
3262 
3263 public static void main(String[] args) {
3264 System.out.println(chat("Briefly, help me build a Python web scraper"));
3265 System.out.println(chat("Briefly, add support for JavaScript-rendered pages"));
3266 System.out.println(chat("Briefly, add rate limiting and error handling"));
3267 }
3297 response = client.beta().messages().create(continueParams);
3298 }
3299 
3300 // Append the final response
3301 messages.add(response.toParam());
3302 
3303 return response.content().stream()
3304 .flatMap(block -> block.text().stream())
3305 .map(textBlock -> textBlock.text())
3306 .findFirst()
3307 .orElse("");
3308 }
3309 
3310 void main() {
3311 System.out.println(chat("Briefly, help me build a Python web scraper"));
3312 System.out.println(chat("Briefly, add support for JavaScript-rendered pages"));
3313 System.out.println(chat("Briefly, add rate limiting and error handling"));
3314 }
32683315 ```
32693316 
32703317 ```php PHP
from line 3325
32783325 $response = $client->beta->messages->create(
32793326 maxTokens: 4096,
32803327 messages: $messages,
3281 model: 'claude-opus-5-5',
3328 model: Model::CLAUDE_OPUS_5_5,
32823329 betas: ['compact-2026-01-12'],
32833330 contextManagement: [
32843331 'edits' => [
from line 3375
33283375 $response = $client->beta->messages->create(
33293376 maxTokens: 4096,
33303377 messages: $messages,
3331 model: 'claude-opus-5-5',
3378 model: Model::CLAUDE_OPUS_5_5,
33323379 betas: ['compact-2026-01-12'],
33333380 contextManagement: [
33343381 'edits' => [['type' => 'compact_20260112']]
from line 3386
33393386 $messages[] = ['role' => 'assistant', 'content' => $response->content];
33403387 
33413388 foreach ($response->content as $block) {
3342 if ($block->type === 'text') {
3389 if ($block instanceof \Anthropic\Beta\Messages\BetaTextBlock) {
33433390 return $block->text;
33443391 }
33453392 }
from line 3504
34573504* Availability: Available
34583505* Usage: Opt in with a `compact_20260112` edit in `context_management.edits`. Compaction starts when input tokens reach the trigger, 150,000 by default and at least 50,000.
34593506 
3460| Status | Cloud platforms | Models |
3461| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3462| Beta | Claude API, [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws), [Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock), [Amazon Bedrock (InvokeModel)](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy), [Claude Models on Google Cloud (Google managed)](https://platform.claude.com/docs/en/build-with-claude/claude-models-on-google-cloud/google-managed), [Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry) | [Claude Fable 5.2](https://platform.claude.com/docs/en/models/fable-5-2/overview), [Claude Mythos 5.2](https://platform.claude.com/docs/en/models/mythos-5-2/overview), [Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/overview), [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/mythos-5-1/overview), [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/overview), [Claude Mythos 5](https://platform.claude.com/docs/en/models/mythos-5/overview), Claude Mythos Preview, [Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/overview), [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/overview), [Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/overview), [Claude Sonnet 5](https://platform.claude.com/docs/en/models/sonnet-5/overview), [Claude Haiku 5.5](https://platform.claude.com/docs/en/models/haiku-5-5/overview), [Claude Opus 4.8](https://platform.claude.com/docs/en/models/opus-4-8/overview), [Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-4-7/overview), [Claude Opus 4.6](https://platform.claude.com/docs/en/models/opus-4-6/overview), [Claude Sonnet 4.6](https://platform.claude.com/docs/en/models/sonnet-4-6/overview) |
3507| Status | Cloud platforms | Models |
3508| ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3509| Beta | Claude API, [Amazon Bedrock (bedrock-runtime)](https://platform.claude.com/docs/en/build-with-claude/claude-on-amazon-bedrock-legacy), [Claude Platform on AWS](https://platform.claude.com/docs/en/build-with-claude/claude-platform-on-aws), [Claude Models on Google Cloud (Google managed)](https://platform.claude.com/docs/en/build-with-claude/claude-models-on-google-cloud/google-managed), [Microsoft Foundry](https://platform.claude.com/docs/en/build-with-claude/claude-in-microsoft-foundry) | [Claude Fable 5.2](https://platform.claude.com/docs/en/models/fable-5-2/overview), [Claude Mythos 5.2](https://platform.claude.com/docs/en/models/mythos-5-2/overview), [Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/overview), [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/mythos-5-1/overview), [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/overview), [Claude Mythos 5](https://platform.claude.com/docs/en/models/mythos-5/overview), Claude Mythos Preview, [Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/overview), [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/overview), [Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/overview), [Claude Sonnet 5](https://platform.claude.com/docs/en/models/sonnet-5/overview), [Claude Haiku 5.5](https://platform.claude.com/docs/en/models/haiku-5-5/overview), [Claude Opus 4.8](https://platform.claude.com/docs/en/models/opus-4-8/overview), [Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-4-7/overview), [Claude Opus 4.6](https://platform.claude.com/docs/en/models/opus-4-6/overview), [Claude Sonnet 4.6](https://platform.claude.com/docs/en/models/sonnet-4-6/overview) |
3510| Beta | [Amazon Bedrock](https://platform.claude.com/docs/en/build-with-claude/claude-in-amazon-bedrock) | [Claude Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/overview), [Claude Mythos 5.1](https://platform.claude.com/docs/en/models/mythos-5-1/overview), [Claude Fable 5](https://platform.claude.com/docs/en/models/fable-5/overview), [Claude Mythos 5](https://platform.claude.com/docs/en/models/mythos-5/overview), [Claude Opus 5.5](https://platform.claude.com/docs/en/models/opus-5-5/overview), [Claude Opus 5](https://platform.claude.com/docs/en/models/opus-5/overview), [Claude Sonnet 5.5](https://platform.claude.com/docs/en/models/sonnet-5-5/overview), [Claude Sonnet 5](https://platform.claude.com/docs/en/models/sonnet-5/overview), [Claude Haiku 5.5](https://platform.claude.com/docs/en/models/haiku-5-5/overview), [Claude Opus 4.8](https://platform.claude.com/docs/en/models/opus-4-8/overview), [Claude Opus 4.7](https://platform.claude.com/docs/en/models/opus-4-7/overview) |
34633511 
34643512#### [Managed Agents](https://platform.claude.com/docs/en/managed-agents/overview)
34653513 
34663514 
Feedback