Claude Platform Docs
MessagesPemadatan

Compaction dan pemikiran yang dipertahankan

Kapan blok thinking dalam giliran yang dipertahankan setelah compaction sesuai permintaan tetap valid pada model dengan pemikiran yang dipertahankan, dan cara memeriksanya.

Lewati halaman ini kecuali Anda mengirim "thinking blocks" (blok pemikiran) kembali ke model dengan "preserved thinking" (pemikiran yang dipertahankan) dan mempertahankan giliran setelah blok "compaction" (pemadatan). "Kept turns" (giliran yang dipertahankan) adalah giliran yang mengikuti blok tersebut: giliran terbaru yang Anda keluarkan dari permintaan compaction, seperti dalam Compaction yang mempertahankan giliran terbaru, atau giliran yang tiba saat ringkasan sedang ditulis, seperti dalam Compaction di latar belakang.

Model dengan pemikiran yang dipertahankan memeriksa blok thinking sebelumnya terhadap percakapan yang menghasilkannya. Ringkasan menggantikan sebagian percakapan tersebut, tetapi pemeriksaan menerima pertukaran itu ketika API yang menulis ringkasannya, sehingga thinking dalam giliran yang dipertahankan dapat tetap valid.

Syarat agar thinking yang dipertahankan tetap valid

Blok thinking dalam giliran yang dipertahankan tetap valid selama semua hal berikut terpenuhi:

  • Permintaan compaction berjalan pada model dengan pemikiran yang dipertahankan. Syarat ini mencakup setiap permintaan compaction sejak blok thinking dihasilkan, bukan hanya yang terbaru. Salah satu cara untuk memenuhinya adalah mengirim setiap permintaan compaction ke model yang digunakan oleh percakapan.
  • Giliran yang dipertahankan langsung mengikuti pesan yang diringkas, dan Anda mengirimnya tanpa perubahan. Kirim setiap pesan yang dipertahankan persis seperti yang ada dalam riwayat Anda. Jangan melewatkan atau menambahkan pesan di antara pesan terakhir yang diringkas dan pesan pertama yang dipertahankan. Pesan pertama yang dipertahankan juga harus memiliki peran yang berbeda dari pesan terakhir yang diringkas, dan tidak boleh berupa pesan role: "system" di tengah percakapan. Jika tidak, API akan menggabungkannya ke dalam pesan terakhir yang diringkas. Salah satu cara untuk mendapatkan pesan pertama yang dipertahankan dengan benar adalah melakukan compaction tepat pada messages dari permintaan yang sudah Anda kirim. Giliran yang dipertahankan kemudian dimulai dengan balasan Claude terhadap permintaan tersebut.
  • system dan tools yang tidak ditandai defer_loading: true tidak berubah. Keduanya sama pada permintaan compaction seperti pada permintaan yang menghasilkan thinking yang dipertahankan, dan tetap sama pada permintaan-permintaan berikutnya. Mengubah prompt sistem atau alat menjelaskan cara mengubahnya dengan aman.

Jika suatu syarat tidak terpenuhi, tidak ada yang gagal saat Anda melakukan compaction, dan API tetap menerima blok tersebut pada permintaan berikutnya. Kegagalan muncul pada permintaan berikutnya yang pertama kali mengirim thinking yang dipertahankan di tempat API memberlakukan pemeriksaan: error 400 secara default, atau blok thinking dibuang jika permintaan menetapkan thinking.block_binding.prefix_mismatch_behavior ke "drop_block". Di Message Batches API, item yang tidak menetapkan field tersebut tidak gagal. Di tempat pemeriksaan berlaku secara default, API justru membuang blok tersebut. Apa yang dilakukan API dengan blok yang tidak valid menjelaskan kedua hasil tersebut, dan Kapan API memberlakukan pemeriksaan menyebutkan permintaan mana yang diperiksa.

Melakukan compaction lagi tanpa merusak thinking yang lebih lama

Anda dapat melakukan compaction lagi dan mempertahankan giliran: blok baru mencakup ringkasan lama dan setiap pesan yang mengikutinya dalam permintaan compaction, dan setiap giliran yang Anda keluarkan dari permintaan tersebut menjadi giliran yang dipertahankan dari blok baru.

Syarat pertama dari syarat untuk thinking yang dipertahankan memperhitungkan setiap compaction sejak blok thinking dihasilkan, sehingga giliran yang Anda pertahankan melalui dua compaction mengharuskan keduanya telah berjalan pada model dengan pemikiran yang dipertahankan.

Compaction yang terjadi sebelum blok thinking dihasilkan tidak diperhitungkan terhadap blok tersebut. Thinking yang dihasilkan setelah sebuah blok terpasang akan terikat pada blok tersebut, dan tetap valid melalui compaction berikutnya yang memenuhi syarat.

Mengubah prompt sistem atau alat

Permintaan berikutnya dapat menggunakan system yang berbeda, tools yang berbeda, atau model yang berbeda dari permintaan compaction, dan API tetap menerima blok tersebut. Perubahan seperti itu dapat membuat thinking dalam giliran yang dipertahankan menjadi tidak valid, tetapi tidak memiliki efek lain.

Untuk mengubah system atau tools tanpa membuat thinking yang dipertahankan menjadi tidak valid, lakukan compaction pada seluruh percakapan terlebih dahulu, sehingga tidak ada giliran yang dipertahankan. Kemudian ubah keduanya pada permintaan berikutnya.

Untuk menambahkan instruksi atau mengubah alat yang tersedia tanpa menyentuh system atau tools, tambahkan perubahan tersebut ke messages, seperti yang dijelaskan dalam Melakukan perubahan tanpa mengedit prefiks.

Pesan sistem di tengah percakapan yang berada di dalam giliran yang diringkas juga ikut diringkas, sehingga instruksi teks di dalamnya berhenti berlaku setelah pertukaran. Agar salah satunya tetap berlaku, nyatakan kembali dalam pesan role: "system" tepat setelah giliran user baru pertama yang mengikuti giliran yang dipertahankan. Perubahan alat di dalam giliran tersebut terbawa dengan sendirinya ketika permintaan compaction juga membawa inline-tools-2026-09-15: blok yang dikembalikan mencatat efek bersihnya dalam field tool_changes, jadi kirim kembali blok tersebut tanpa modifikasi. Jika blok tidak memiliki field tool_changes, nyatakan kembali perubahan alat tersebut dengan cara yang sama. Pesan sistem yang ditempatkan di antara blok dan giliran yang dipertahankan akan merusak thinking di dalam giliran tersebut.

Memeriksa bahwa thinking yang dipertahankan tetap valid

Respons compaction tidak menyatakan apakah thinking yang dipertahankan tetap valid. Permintaan pertama setelah pertukaranlah yang menyatakannya. Untuk memeriksanya dalam pengujian Anda:

  1. Lakukan percakapan singkat dengan thinking diaktifkan. Gunakan model tempat API menjalankan pemeriksaan (lihat Kapan API memberlakukan pemeriksaan), dan gunakan model tersebut untuk setiap langkah, karena model yang tidak dapat membaca blok thinking akan membuangnya tanpa error.
  2. Lakukan compaction pada giliran yang lebih lama, dan pertahankan setidaknya satu giliran yang berisi blok thinking.
  3. Kirim permintaan berikutnya, dengan blok terlebih dahulu, lalu giliran yang dipertahankan, lalu pesan user baru, dan dengan thinking.block_binding.prefix_mismatch_behavior ditetapkan ke "error".
  4. Baca hasilnya. Respons 200 yang array input_transformations-nya kosong berarti tidak ada blok thinking yang gagal dalam pemeriksaan atau dibuang. Error 400 yang menyatakan bahwa blok terikat pada percakapan yang berbeda berarti ada yang gagal. Pesan tersebut dimulai dengan path dari blok pertama yang gagal, dan Apa yang dilakukan API dengan blok yang tidak valid menampilkannya secara lengkap.

Field prefix_mismatch_behavior memerlukan header beta thinking-binding-controls-2026-08-01 selain header beta compact-2026-09-04. Menetapkan field tersebut juga mengikutsertakan permintaan ke dalam pemeriksaan pada akun yang pemeriksaannya tidak aktif secara default.

Program berikut menjalankan keempat langkah tersebut. Program ini mencetak berapa banyak blok thinking yang ada dalam giliran yang dipertahankan dan berapa banyak entri yang dimiliki input_transformations; tidak adanya entri berarti thinking yang dipertahankan tetap valid:

from anthropic.types.beta import BetaMessageParam, BetaThinkingConfigParam

client = anthropic.Anthropic()

# Claude Fable 5.1 adalah model pertama yang memeriksa thinking yang dikirim balik terhadap percakapan.
MODEL = "claude-fable-5-1"
BETAS = ["compact-2026-09-04", "thinking-binding-controls-2026-08-01"]
SYSTEM = "You help plan a recipe app's release. Keep answers short."
# Dengan "error", blok thinking yang gagal pemeriksaan membuat permintaan gagal dengan kode 400.
THINKING: BetaThinkingConfigParam = {
    "type": "adaptive",
    "block_binding": {"prefix_mismatch_behavior": "error"},
}

# 1. Lakukan percakapan singkat dengan thinking aktif.
history: list[BetaMessageParam] = [
    {"role": "user", "content": "What are the main entities in the app's data model?"}
]
first = client.beta.messages.create(
    model=MODEL,
    max_tokens=8192,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history,
)
history += [
    {"role": "assistant", "content": first.content},
    {
        "role": "user",
        "content": "Testing starts on Tuesday, March 3, 2026, takes 10 weekdays, and pauses on March 9 and March 16. On which date does it end?",
    },
]
second = client.beta.messages.create(
    model=MODEL,
    max_tokens=8192,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history,
)
history.append({"role": "assistant", "content": second.content})
thinking_blocks = sum(block.type == "thinking" for block in second.content)
print(f"Thinking blocks in the kept turn: {thinking_blocks}")

# 2. Ringkas giliran pertama. Giliran kedua tidak disertakan dalam permintaan.
summary = client.beta.messages.create(
    model=MODEL,
    max_tokens=4096,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history[:2],
    compaction={"type": "summarize"},
)
if summary.stop_reason != "compaction":
    raise SystemExit(f"No summary: {summary.stop_reason}")

# 3. Letakkan blok di depan giliran yang dipertahankan, lalu ajukan pertanyaan berikutnya.
history = [
    {"role": "assistant", "content": summary.content},
    *history[2:],
    {"role": "user", "content": "Which day should the release go out?"},
]
third = client.beta.messages.create(
    model=MODEL,
    max_tokens=8192,
    system=SYSTEM,
    betas=BETAS,
    thinking=THINKING,
    messages=history,
)

# 4. Respons 200 tanpa blok yang dibuang berarti thinking yang dipertahankan tetap berlaku.
print(f"Dropped thinking blocks: {len(third.input_transformations)}")
Output
Thinking blocks in the kept turn: 1
Dropped thinking blocks: 0

Di produksi, "drop_block" membuat permintaan tetap berhasil ketika suatu syarat tidak terpenuhi, dan melaporkan setiap blok yang dibuang dalam input_transformations dengan reason: "prefix_binding_mismatch". Entri yang path-nya berada dalam giliran yang dipertahankan berarti thinking pada giliran tersebut tidak lagi valid. Apa yang dilakukan API dengan blok yang tidak valid menjelaskan apa yang dibuang dan cara memasang peringatan untuknya.

Compatibility

Supported models
  • Fable 5 and 5.1
  • Mythos 5, 5.1, and Preview
  • Opus 4.6, 4.7, 4.8, 5, and 5.5
  • Sonnet 4.6 and 5
Supported platforms
  • Claude APIBeta
  • Claude Platform on AWSBeta
  • Google CloudBeta
  • Microsoft FoundryBeta

Was this page helpful?