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