Compaction yang mempertahankan giliran terbaru
Ringkas giliran-giliran lama dalam percakapan dengan compaction sesuai permintaan, lalu kirim giliran-giliran terbaru setelah ringkasan, kata demi kata.
"Keep-tail compaction" (compaction yang mempertahankan ekor percakapan) mempertahankan beberapa giliran terakhir dari sebuah percakapan kata demi kata setelah ringkasan. Fitur ini mengubah dua hal dalam loop compaction: pesan mana yang masuk ke dalam permintaan compaction, dan apa yang Anda kirim setelah blok. Semua yang ada di Melanjutkan dari ringkasan tetap berlaku tanpa perubahan.
Memilih giliran yang dipertahankan
Tidak ada parameter yang menentukan giliran mana yang dipertahankan. Anda memilih titik potong dalam riwayat Anda: pesan-pesan sebelum titik tersebut masuk ke dalam permintaan compaction, dan pesan-pesan mulai dari titik tersebut dan seterusnya dipertahankan.
Giliran yang dipertahankan dikirim kembali ke Claude dengan panjang penuh, sehingga semakin banyak yang Anda pertahankan, semakin sedikit ruang yang dibebaskan oleh compaction.
Letakkan titik potong di tempat yang tidak menyisakan panggilan alat yang masih terbuka, dengan setiap panggilan alat dan hasilnya berada di sisi yang sama. Jika pesan-pesan yang Anda kirim diakhiri dengan giliran assistant yang panggilan alatnya belum memiliki hasil, API akan menolak permintaan compaction tersebut.
Melakukan compaction pada giliran-giliran lama dan mengirim sisanya setelah blok
Untuk mempertahankan ekor berupa giliran-giliran terbaru kata demi kata, jangan sertakan giliran-giliran tersebut dalam permintaan compaction. API meringkas setiap pesan yang dikirimkan kepadanya, jadi kirim hanya giliran-giliran lama, lalu letakkan blok di depan giliran-giliran yang Anda pertahankan.
Kirim giliran yang dipertahankan persis seperti yang ada di riwayat Anda, termasuk "thinking blocks" (blok pemikiran). Kedua permintaan membawa header beta, seperti pada Meminta ringkasan.
Dalam contoh berikut, riwayat berisi dua giliran, dan titik potong mempertahankan giliran kedua. Permintaan compaction membawa giliran pertama:
{
"model": "claude-opus-5-5",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "I am building a recipe app. Help me name the main entities in the data model."
},
{
"role": "assistant",
"content": "Start with Recipe, Ingredient, and Step. Add a RecipeIngredient entry that holds the quantity and unit for each ingredient in a recipe."
}
],
"compaction": { "type": "summarize" }
}Permintaan berikutnya mengirim blok yang dikembalikan terlebih dahulu, lalu giliran yang dipertahankan persis seperti aslinya, kemudian pesan user yang baru. Melanjutkan dari ringkasan menunjukkan permintaan yang dimulai dengan sebuah blok.
Program berikut adalah loop dari Compaction dalam loop, yang diubah untuk mempertahankan dua giliran terakhir. Baris yang disorot menunjukkan bagian yang berbeda dari loop tersebut.
from anthropic.types.beta import BetaMessageParam
client = anthropic.Anthropic()
# Atur nilai ini mendekati anggaran input Anda yang sebenarnya. Di sini dibuat rendah agar percakapan singkat pun dipadatkan.
COMPACT_AT_TOKENS = 2500
SYSTEM = "You help design a recipe app's data model. Keep answers short."
KEEP_TURNS = 2
QUESTIONS = [
"What are the main entities in the data model?",
"Which fields should Recipe have?",
"Which fields should Ingredient have?",
"Which fields should RecipeIngredient have?",
"Which fields should Step have?",
"Which indexes should these tables have?",
"Which fields should be required?",
"Which fields should have default values?",
]
history: list[BetaMessageParam] = []
for turn, question in enumerate(QUESTIONS, start=1):
history.append({"role": "user", "content": question})
response = client.beta.messages.create(
model="claude-opus-5-5",
max_tokens=8192,
system=SYSTEM,
betas=["compact-2026-09-04"],
messages=history,
)
history.append({"role": "assistant", "content": response.content})
# Permintaan berikutnya juga mengirim balasan ini, jadi ikut hitung.
conversation_tokens = response.usage.input_tokens + response.usage.output_tokens
if conversation_tokens > COMPACT_AT_TOKENS and KEEP_TURNS < turn < len(QUESTIONS):
# Satu giliran terdiri dari satu pesan pengguna dan satu balasan asisten,
# sehingga giliran yang dipertahankan diawali dengan pesan pengguna.
split = -2 * KEEP_TURNS
older, recent = history[:split], history[split:]
summary = client.beta.messages.create(
model="claude-opus-5-5",
max_tokens=4096,
system=SYSTEM,
betas=["compact-2026-09-04"],
messages=older,
compaction={"type": "summarize"},
)
if summary.stop_reason == "compaction":
history = [{"role": "assistant", "content": summary.content}, *recent]
print(f"Kept {len(recent) // 2} turns after the block")- Memilih titik potong: Program mempertahankan dua giliran terakhir, di mana satu giliran adalah satu pesan
userbeserta balasannya. Program membagi riwayat pada posisi empat pesan dari akhir, sehingga giliran yang dipertahankan dimulai dengan pesanuser. - Menentukan kapan melakukan compaction: Pemeriksaan ukuran juga mensyaratkan bahwa percakapan memiliki lebih banyak giliran daripada yang dipertahankan program, sehingga bagian lama tidak pernah kosong.
- Permintaan compaction: Sementara loop mengirim seluruh riwayat, versi ini hanya mengirim pesan-pesan lama.
- Penukaran: Sementara loop mengganti seluruh riwayat dengan pesan yang dikembalikan, riwayat baru pada versi ini adalah pesan yang dikembalikan diikuti oleh giliran-giliran yang dipertahankan.
Pemeriksaan stop_reason dan setiap permintaan setelah penukaran tidak berubah dari loop tersebut.
Menjaga validitas thinking dalam giliran yang dipertahankan
Jika Anda mengirim kembali blok thinking pada model dengan "preserved thinking" (pemikiran yang dipertahankan), thinking dalam giliran yang dipertahankan hanya tetap valid selama syarat agar thinking yang dipertahankan tetap valid terpenuhi, dan salah satu syarat tersebut membatasi di mana titik potong dapat diletakkan.
Titik potong program, yaitu di antara sebuah balasan dan pesan user berikutnya, memenuhi syarat tersebut. Begitu pula titik potong di akhir permintaan yang sudah Anda buat: lakukan compaction tepat pada messages dari permintaan tersebut, dan pertahankan semua yang telah ditambahkan ke riwayat Anda sejak saat itu.
Compatibility
| Supported models |
|
|---|---|
| Supported platforms |
|
Was this page helpful?