gemini-compact
Context dolunca Claude onu bir Claude isteği daha göndererek sıkıştırır: bu istek bütün context'i okur, bir özet yazar ve Claude kullanımından düşer. Bu mod o işi Gemini'ye verir. İki modu vardır:
- summary (varsayılan): Gemini konuşmanın en yeni 6 mesajdan önceki kısmını özetler; o mesajlar özetin ardından kelimesi kelimesine kalır. Claude özet yazmaz; engine'in yerleşik özeti yalnız Gemini başarısız olunca çalışır.
- prune: Gemini eski her tool çağrısı için karar verir: çağrı ve çıktısı kalsın mı, çıktısı kısaltılarak mı kalsın, yoksa gitsin mi. Kullanıcının ve asistanın her mesajı kelimesi kelimesine kalır. Hiçbir şey özetlenmez.
Prune fikri Tamara Tran'ın fast-jev-compaction'ından (tamaratran/fast-jev-compaction) gelir; o TypeSafe Jev'e sorar. Buradaki kod yenidir ve Gemini'ye sorar.
Hangi mod
İki mod da yerleşik compaction'ın Claude isteğinin yerine bir Gemini isteği koyar.
Compaction'dan sonra her Claude isteği geriye kalanı okur. Summary modunda bu, özet ve en yeni mesajlardır; yerleşik özetin bıraktığına yakındır. Prune modunda ise konuşmanın bütün mesajlarıdır, yalnız atılan tool çıktıları eksilir. Bu daha büyüktür, yani sonraki her istek daha fazla okur. Boyutlar uzun bir session'da ölçülmedi.
Claude kullanımından en çok tasarruf için summary modunu seç. Her mesajın birebir metni boyuttan önemliyse prune modunu seç.
Summary modu
/compact'ta, engine'in kendi compaction'ında ve cevapla biten bir ana loop turn'ü context'i eşiğin üstünde bıraktığında,session.compacthook'u konuşmayı alır.- En yeni 6 mesaj kalır. Kesim noktası bir asistan mesajına geri çekilir; böylece hiçbir tool sonucu çağrısı olmadan kalmaz ve özetten sonra kalan kısım bir asistan mesajıyla başlar. Kesilecek bir asistan mesajı yoksa her şey özetlenir.
- Tek bir
generateContentisteği kesimden önceki her şeyi Gemini'ye gönderir: her mesajı ve her çağrıyı, input'u ve tam çıktısıyla. MetinsummaryMaxInputChars'ı (varsayılan 2.000.000 karakter) aşarsa en uzun çıktılar ortak bir uzunluğa kısaltılır; her biri baş ve son kısmını korur. Çıktıların hepsi çıkarıldığında bile sınırı aşan bir konuşma başarısız olur. - Gemini dokuz bölümlük düz metin bir özet yazar: istek ve amaç, teknik kavramlar, dosyalar ve kod, hatalar ve düzeltmeler, problem çözme, kullanıcının bütün mesajları kelimesi kelimesine, bekleyen görevler, o anki iş ve sonraki adım.
/compact'tan sonra yazdığın metin de onunla birlikte Gemini'ye gider. - Konuşma, tek bir kullanıcı mesajına (önce bir not, sonra özet) ve ardından kalan mesajlara dönüşür; kalan mesajlar engine'in kendi mesajları olarak geri gider.
- Şu durumlarda yerleşik özet çalışır ve bir satır nedenini söyler: key yoksa, en yeni mesajlardan önce hiçbir şey yoksa, Gemini başarısız olursa, özet 200 karakterden kısaysa ya da çıktı sınırında (32.768 token) kesildiyse, ya da sonuç konuşmadan küçük değilse.
İki modda da isteği gemini-core kurar: gemini-compact için tuttuğu key, model ve thinking seviyesiyle. Cevabı da o okur. HTTP 503'ten ("high demand") sonra mod 1 sn, 2 sn ve 3 sn sonra yeniden sorar; toplam en fazla dört deneme olur. Beklemesi 60 sn'yi aşacak bir deneme başlamaz. 429'dan ya da bir key hatasından sonra gemini-core, elinde başka bir key varsa isteği onunla yeniden gönderir.
2.1.277 üzerinde yapılan canlı denemede /compact gemini-3.5-flash-lite ile 2,6 saniye sürdü, Claude hiçbir compaction isteği göndermedi ve ardından model yalnız özetlenen kısımda geçen bir kelimeyi ve bir dosyayı adıyla andı.
Prune modu
- Aynı üç tetik
session.compacthook'una ulaşır. - İlk mesajdaki ya da en yeni 6 mesajdaki bir tool çağrısı, ya da sonucu bunlardan birinde olan bir çağrı, bütünüyle kalır. Diğer her çağrı bir id alır (
c1,c2, ...). Böyle bir çağrı yoksa yerleşik özet çalışır. - Tek bir
generateContentisteği konuşmayı Gemini'ye gönderir: her mesajı ve her çağrıyı, input'u ve tam çıktısıyla.maxInputChars'ın (varsayılan 400.000 karakter) üstünde en uzun çıktılar summary modundaki gibi kısaltılır. Bir response schema her id için tam bir cevaba izin verir:keep,truncateya dadrop. - Mod cevabı kontrol eder (her id tam bir kez, başka id yok) ve konuşmayı yeniden kurar:
keep: çağrı ve çıktısı kalır.truncate: çağrı kalır; çıktının ilk 300 karakteri ve kesildiğini söyleyen bir satır kalır. Bundan en fazla 120 karakter uzun bir çıktı bütünüyle kalır.drop: çağrı ve çıktısı gider. En yakın asistan mesajına kaldırılan çağrıları sayan bir not eklenir, örneğin[gemini-compact removed 1 earlier tool call(s) and their output after a compaction; they ran: Bash(ls -la /usr/bin)]. Not olmadığında model, işi silinmiş bir cevabını okudu ve o işi hiç yapmadığını söyledi (2.1.277 üzerinde ölçüldü).- Cevabın dokunmadığı bir mesaj engine'in kendi mesajı olarak geri gider.
- Sonuç %25'ten az küçüldüyse ya da bir şey başarısız olursa (key yok, bir HTTP hatası, schema'ya uymayan bir cevap), engine'in yerleşik özeti çalışır ve bir satır nedenini söyler.
2.1.277 üzerinde yapılan canlı denemede /compact gemini-3.5-flash-lite ile 1,1 saniye sürdü. Gemini bir ls listesini attı, kullanıcının düzenlemek üzere olduğu bir dosyanın cat çıktısını tuttu ve konuşma %93 küçüldü.
Ne gösterir
Transcript'e modele gitmeyen tek bir satır düşer, bir de 15 saniye duran bir toast çıkar:
gemini-compact: summary: 58 → 7 messages · 91% smaller · 312k in, 5k out
gemini-compact: kept 9/11 messages · 93% smaller · 1 dropped, 0 truncated · 5k in, 59 out
gemini-compact: built-in summary: under 25% smaller (kept 14/16 messages · 3% smaller · ...)
gemini-compact: built-in summary: Gemini HTTP 429: Resource has been exhausted
Free tier'da toast'a · sent to Gemini free tier eklenir. Engine'in atladığı ya da başarısız olan otomatik bir compaction da bir satır yazar (automatic compaction skipped: ..., automatic compaction failed: ...).
Komut
/gemini-compact on ya da off, mod, gemini-core'un tuttuğu model ve thinking seviyesi, eşik, tier, key var mı, son sonuç
/gemini-compact on | off off her compaction'ı yerleşik özete bırakır; gemini-core'da key yokken on reddedilir
/gemini-compact mode summary | mode prune
/gemini-compact at <1-99> context'i bu yüzdenin üstünde bırakan bir turn'den sonra sıkıştırır
/gemini-compact at off otomatik compaction yok; /compact ve engine'in kendi compaction'ı yine Gemini'ye sorar
/gemini-compact reset plugin option'larına döner ve kapanır
Mod kurulumdan sonra kapalıdır: her compaction yerleşik olandır, mod'un eşiğinde hiçbiri başlamaz ve /gemini-compact on'a kadar Gemini'ye hiçbir şey gitmez. Komut ayarları session'lar arasında korunur ve hemen geçerli olur. Mod başlattığı bir compaction'dan sonra, bir turn context'i eşiğin altında bırakana kadar yenisini başlatmaz; böylece eşiğin üstünde kalan bir context her turn'den sonra sıkıştırılmaz.
Key, tier, model (varsayılan gemini-3.5-flash-lite) ve thinking seviyesi gemini-core'a aittir:
/gemini-core model compact gemini-3.5-flash
/gemini-core thinking compact low
/gemini-core paid
Free tier mı paid tier mı
Konuşmada prompt'ların, modelin çalıştırdığı komutlar ve okuduğu dosyaların içeriği vardır. Free tier'da Google bunları kullanabilir, insan denetçiler de okuyabilir; gemini-core README'si Gemini API Additional Terms'ten ilgili kısmı aktarır. Google'a göstermek istemediğin bir projede billing'i açık bir key kullan ve /gemini-core paid ayarla. Hiçbir mod bir key'in hangi tier'da olduğunu bilemez; tier ayarı yalnız uyarıyı seçer.
Model başına free tier sınırlarını Google AI Studio gösterir, dokümantasyon göstermez. Ölçülmediler. Uzun bir konuşmanın özeti tek bir büyük istektir; dakika başına bir token sınırı onu HTTP 429 ile reddedebilir, o zaman yerleşik özet çalışır.
Kurulum
claude plugin marketplace add KilimcininKorOglu/claude-code-mods
claude plugin install gemini-compact@kilimcininkoroglu-mods
gemini-core'a bağlıdır; claude plugin install onu da kurar. Function hook'lar henüz early access aşamasında. Claude Code 2.1.288 ve üzerinde varsayılan olarak yüklenir, açılacak bir ayar yok.
Yerel bir checkout'tan tek session için yüklemek istersen gemini-core'u da yanına koy:
claude --plugin-dir plugins/gemini-core --plugin-dir plugins/gemini-compact
Kurulumdan sonra
- Gemini key'ini ve tier'ı gemini-core'da, onun After installing bölümünde anlatıldığı gibi ayarla, sonra Claude Code'u yeniden başlat.
/gemini-compact onçalıştır. Key yoksastill off: gemini-core has no Gemini keycevabını verir ve kapalı kalır./gemini-compactçalıştır. İlk satıron · summary · <model> · thinking ... · automatic at 60% · <tier> tier · key setolmalı.- Bir kez
/compactçalıştır. Transcript satırıgemini-compact: summary:ile başlamalı.built-in summary:ile başlayan bir satır Gemini'nin neden kullanılmadığını söyler.
0.2.x'ten güncelliyorsan: claude plugin update gemini-core'u eklemez (2.1.278 üzerinde ölçüldü), bu yüzden bir kez claude plugin install gemini-core@kilimcininkoroglu-mods çalıştır. 0.3.0 key'i, tier'ı ve modeli gemini-core'a taşıdı; apiKey, tier ve model option'ları ile daha önce /gemini-compact free|paid|model ile saklanan ayarlar artık okunmuyor, onları gemini-core'da yeniden ayarla. mode ve at ayarları kalır. 0.4.0 mod'u varsayılan olarak kapattı: daha eski bir sürümden güncellediysen ve önceden /gemini-compact on çalıştırmadıysan mod kapalıdır; bir kez /gemini-compact on çalıştır.
Option'lar
| Option | Varsayılan | Ne ayarlar |
|---|---|---|
mode |
summary |
summary ya da prune; /gemini-compact mode onu geçersiz kılar |
compactAtPercent |
60 |
Otomatik eşik, 0 ile 99 arası; 0 kapatır; /gemini-compact at onu geçersiz kılar |
keepRecent |
6 |
Kelimesi kelimesine kalan (summary) ya da çağrıları hiç karara gönderilmeyen (prune) en yeni mesaj sayısı; 0 ile 1000 arası |
minReduction |
0.25 |
Prune modu: bu oranın (0 ile 1 arası) altında yerleşik özet çalışır |
headChars |
300 |
Prune modu: kısaltılan bir çıktıdan kalan karakter; 0 ile 100.000 arası |
maxInputChars |
400000 |
Prune modu: Gemini'ye giden en fazla karakter; 10.000 ile 4.000.000 arası |
summaryMaxInputChars |
2000000 |
Summary modu: Gemini'ye giden en fazla karakter; 10.000 ile 4.000.000 arası |
Aralık dışındaki bir değerin yerine varsayılan kullanılır.
Nereye uzanır
Claude Code 2.1.283 üzerinde claude plugin validate ile doğrulandı:
❯ ./register.ts hooks: session.start, command.run{command=gemini-compact}, session.compact, turn.complete
❯ ./register.ts calls: $.clock.now (via askGemini), $.clock.sleep (via askGemini), $.command.register, $.gemini.enroll, $.gemini.read (via askGemini), $.gemini.request (via askGemini), $.gemini.settings (via compactWithGemini, runCommand, storePatch), $.http.fetch (via askGemini), $.session.compact (via maybeCompact), $.session.usage (via maybeCompact), $.store.delete (via runCommand), $.store.get (via loadConfig), $.store.set (via storePatch), $.ui.log, $.ui.toast (via report)
Reach L3: network'e çıkar.
1. Okur: her compaction'da konuşmayı (mesajlar, tool input'ları ve output'ları); her ana loop turn'ünden sonra context doluluğunu; kendi $.store dosyasını; gemini-core'dan key'i taşıyan isteği
2. Çalıştırır: hiçbir process; eşiğin üstünde biten bir turn'den sonra bir $.session.compact, context yeniden eşiğin altına inene kadar en fazla bir kez
3. Gönderir: konuşmayı (summary: en yeni mesajlar dışında hepsini; prune: tamamını), compaction başına bir istek (503 sonrası en fazla dört, 429 ya da key hatası sonrası ek key başına bir tane daha), gemini-core'un kurduğu URL'ye (generativelanguage.googleapis.com), key x-goog-api-key header'ında, hiçbir zaman URL'de değil
4. Saklar: $.store içinde üç komut ayarını (enabled, mode, atPercent); son sonuç bellekte yaşar
5. Düşman girdi: Gemini cevabı güvenilmezdir: bir prune cevabı yalnız schema biçiminde ve her aday id tam bir kez geçiyorsa uygulanır; bir özet, modelin okuduğu bir kullanıcı mesajının metni olur, yani düşman bir özet modeli okuduğu bir dosyadaki metin gibi yönlendirebilir; bozuk her şey yerleşik özete düşer
Sınırlar
- Bir özet ve bir drop kararı bir modelin yargısıdır. Özet, en yeni mesajların tekrarlamadığı ayrıntıyı kaybeder. Prune notu modele hangi çağrıların çalıştığını söyler, model de bir tool'u yeniden çalıştırabilir.
- Compaction'dan sonra context cache'e yeniden yazılır. Prune modunda context yerleşik bir özetten büyük kaldığı için sonraki mesaj daha büyük bir cache yazımı öder.
- Uzun bir konuşmanın özeti Gemini'de daha uzun sürer ve compaction onu bekler. Yalnız kısa konuşmalar ölçüldü.
- Bir subagent'ın kendi compaction'ı engine'e bırakılır.
- Engine'in önceden hesapladığı bir compaction (
precompute) da Gemini'ye sorar. Engine'in bu sonucu ardından gelen compaction için kullanıp kullanmadığı ölçülmedi. claude plugin test'in test engine'i bir$.session.compact()çağrısınatriggergeçirmez.plugintrigger'ı ve ona cevap veren hook canlı bir session'da ölçüldü.
Geliştirme
make install # eslint, typescript-eslint, typescript
make lint # complexity sınırı 10; aşılırsa build kırılır
make typecheck # /plugin-types çıktısı olan .claude/types/ gerekir
make validate
make test # claude plugin test