- pxpipe, Claude Code isteklerindeki büyük bağlamı yerel bir proxy’de PNG görsellere dönüştürerek girdi token’larını azalttığını ve Fable’ın mevcut liste fiyatına göre uçtan uca faturalandırmayı yaklaşık %59~70 düşürdüğünü belirtiyor
- Temel ilke, görsel token maliyetinin görselin içindeki metin miktarına değil piksel boyutuna göre belirlenmesi; kod, JSON ve araç çıktısı gibi yoğun metinler gerçek Claude Code trafiğinde görsel token başına yaklaşık 3,1 karakter, metin token’ı başına yaklaşık 1 karakter taşıyor
- Sıkıştırma hedefleri büyük
tool_result’lar, eski katlanmış geçmiş, statik sistem prompt’ları ve araç dokümantasyonu; son turlar, kullanıcı mesajları, model çıktıları, seyrek prose ve izin listesinin dışındaki modeller ise metin olarak aynen geçirilir
- Kayıplı bir yöntem olduğundan, 12 karakterlik hex dizelerini tam hatırlama Fable 5’te 13/15, Opus’ta 0/15 oldu; eksikler hata olarak değil makul görünen yanlış cevaplar olarak ortaya çıkabildiğinden ID, hash ve secret gibi byte düzeyinde doğruluk gerektiren değerler metin olarak tutulmalı
- Varsayılan hedef modeller
claude-fable-5,gpt-5.6; Opus 4.7/4.8 ve GPT 5.5, görsel bağlam okuma performansındaki düşüş nedeniyle yalnızca opt-in olarak kullanılıyor; gerçekten uygulanıp uygulanmadığı ve tasarruf miktarı istek bazında ~/.pxpipe/events.jsonl üzerinden görülebiliyor
pxpipe’ın azaltmaya çalıştığı maliyet
- pxpipe, Claude Code’un girdi token’larını azaltmak için büyük bağlamı görsel olarak render eden yerel bir proxy’dir
- Hedefi, sistem prompt’u, araç dokümantasyonu, geçmiş history ve büyük araç çıktıları gibi istek gövdesindeki hacimli girdi bloklarıdır
- Model çıktısını sıkıştırmaz ve yanıt streaming’i normal şekilde çalışır
- Bir görselin token maliyeti, görseldeki karakter sayısına değil piksel boyutuna göre belirlenir
- Gerçek Claude Code trafiğinde yoğun içerik, görsel token başına yaklaşık 3,1 karakter taşır
- Metin token’ının yaklaşık 1 karakter seviyesinde olduğu ölçülmüştür
- Örnek render, yaklaşık 48 bin karakterlik sistem prompt’u ve araç dokümantasyonunu tek bir 1573×1248 görsele sığdırdı; metin olarak yaklaşık 25 bin token, görsel olarak ise yaklaşık 2,7 bin görsel token gerekiyordu
Çalıştırma ve dashboard
npx pxpipe-proxy # proxy on 127.0.0.1:47821
ANTHROPIC_BASE_URL=http://127.0.0.1:47821 claude # point Claude Code at it
- Proxy
127.0.0.1:47821 üzerinde çalışır
- Dashboard
http://127.0.0.1:47821/ adresinden sunulur
- Kaydedilen token sayısı
- Metin→görsel dönüşümünün yan yana karşılaştırması
- Kill switch
- Gerçek zamanlı model chip’i
- Son turlar metin olarak tutulur; sistem prompt’u, araç dokümantasyonu ve eski büyük history görselleştirilir
Demoda görülen sonuçlar
- Fable 5 varsayılandır ve README’de 100/100 okuma modeli olarak sunulur
- 39 görselleştirilmiş filler dosyada tam token sayısını 10/10 doğru bildi
grep sonuçlarıyla satır satır eşleşti
- Çok adımlı ledger aritmetiğini doğru yaptı
- Oturum maliyeti pxpipe ile $6.06, düz metinle $42.21 olarak sunuldu
- pxpipe tarafında istenen tek satırlık çıktı formatına uyması için bir kez nudging gerekti
- Opus 4.8 varsayılan olarak devre dışıdır
- Metin needle her iki tarafta da okundu
- Görselleştirilmiş phrase-count Opus tarafından okunamadı ve pxpipe sayı uydurmak yerine başarısızlığı gösterdi
- Bu yanlış okuma oranı nedeniyle Opus opt-in kapsamındadır
Doğruluk ve kayıplılık
- pxpipe kayıplı sıkıştırma yöntemidir
- Yoğun görsel içerikte 12 karakterlik hex dizelerini tam hatırlama sonuçları modele göre büyük ölçüde değişti
- Fable 5: 13/15
- Opus: 0/15
- Eksiklikler hata olarak değil sessiz confabulation olarak ortaya çıkabilir
- ID, hash ve secret gibi byte düzeyinde doğruluk gerektiren değerler metin olarak tutulmalıdır
- Özel bir verbatim-risk guard henüz yerleşik değildir
- İzin listesinde olmayan bir model kullanan subagent metin olarak geçirilebilir
CLAUDE_CODE_SUBAGENT_MODEL=claude-sonnet-4-6
- agent frontmatter’ında
model: sonnet
Benchmark’lar ve ölçümler
- Yeni rastgele sayı problemlerine dayalı benchmark’ta modelin ezberlemiş olma ihtimali düşük problemler kullanıldı
| Test |
N |
Metin |
pxpipe görsel |
Token |
novel arithmetic, claude-fable-5 |
100 |
100% |
100% |
−38% |
novel arithmetic, claude-opus-4-8 |
100 |
100% |
93% |
−38% |
| gist recall A/B, Fable 5 |
98/arm |
98/98 |
98/98 |
- |
| state tracking, Fable 5 |
18/arm |
18/18 |
18/18 |
- |
| never-stated facts confabulation, Fable 5 |
16/arm |
0/16 |
0/16 |
- |
| verbatim 12-char hex recall, dense render, Opus |
15 |
15/15 |
0/15 |
- |
| verbatim 12-char hex recall, dense render, Fable 5 |
15 |
- |
13/15 |
- |
- SWE-bench Lite pilot’ta iki taraf da 10/10 oldu ve istek boyutu −%65’ti
- SWE-bench Pro’da ON 14/19, OFF 15/19 oldu; istek boyutu −%60’tı
- Kararlar 18/19’da eşleşti
- Bir split, tekrar çalıştırmada 3/3 olarak yeniden çözüldü
- README bunu sıkıştırma problemi değil, çalıştırmalar arası değişkenlik olarak ele alıyor
- Örneklem sayısının küçük olduğuna dair caveat eklenmiş
- GSM8K görselleştirilmiş halde %96’ydı, ancak eğitim verisine dahil olabilir; bu yüzden README novel-number değerlendirmesini öne çıkarıyor
Çalışma biçimi
tool_result string ──► wrap at 1928px-wide columns ──► pack ~92,000 chars/page ──► PNG[]
- Proxy
/v1/messages’ı yakalar ve uygun büyük girdileri image block olarak yeniden yazar
- Dönüştürülen bloklar cache dostu şekilde yeniden eklenir; statik prefix korunur ve prompt caching çalışmaya devam eder
- 1928×1928 görsel yaklaşık 4.761 vision token kullanır ve yaklaşık 92.000 karakter taşır
- Metnin kazanması için yaklaşık 19 karakter/token’ı aşması gerekir; Claude Code trafiği N=391 bazında yaklaşık 1,91 olarak ölçüldü
- İstek bazlı tahminleyici, görselleştirme yapılıp yapılmayacağına karar verir; seyrek prose metin olarak tutulur
- Olaylar
~/.pxpipe/events.jsonl dosyasına kaydedilir
Neyi sıkıştırır, neyi olduğu gibi bırakır
- Sıkıştırma hedefleri üç girdi bloğudur ve hepsi kârlılık kapısının arkasındadır
- Yaklaşık 6 bin karakterden uzun, token yoğun
tool_result gövdeleri
- live tail’in arkasındaki eski katlanmış history
- Statik sistem prompt’u ve araç dokümantasyonu slab’i
- Aynen geçirilen öğeler de açıkça belirtilmiştir
- Kullanıcı mesajları
- Son turlar
- Model çıktıları
- Seyrek prose
- Fayda sağlamayacak kadar küçük bloklar
- İzin listesi dışındaki modeller
- Varsayılan kapsam Fable 5 ve GPT 5.6’dır
- Opus 4.8 ve GPT 5.5, görsel içeriği okuma performansları zayıf olduğu için dashboard’dan veya
PXPIPE_MODELS ile açıkça etkinleştirilmelidir
PXPIPE_MODELS=off görselleştirmeyi devre dışı bırakır
- GPT yolunda araç tanımları native JSON olarak tutulur ve Anthropic
cache_control işaretçileri kullanılmaz
Maliyet hesaplama yöntemi
- Başlıktaki tasarruf oranı yalnızca girdi dilimleri değil, toplam fatura bazındadır
- 13.709 istekten oluşan snapshot’ta $100 yaklaşık $41’e düşerek %59 tasarruf olarak hesaplandı
- Daha sonra 8.904 sıkıştırılmış istek trace’inde yaklaşık %70 ölçüldü
- Yalnızca sıkıştırılmış isteklere bakıldığında oran 72~74% seviyesinde, ancak README bunu başlık olarak kullanmıyor
- Her
/v1/messages POST’u için orijinal sıkıştırılmamış gövde üzerinde ücretsiz count_tokens counterfactual paralel çalıştırılır
- Gerçek faturalandırılmış kullanım, Anthropic yanıtındaki usage block’tan okunur
- Orijinal ve gerçek kullanım aynı
~/.pxpipe/events.jsonl satırına kaydedilerek turn-count veya run-to-run confound önlenir
- Dolar dönüşümü Fable 5 liste fiyatı oranlarını kullanır
- input ×1.0
- cache write ×1.25
- cache read ×0.1
- output ×5
- Cache fiyatı iki tarafa da aynı uygulanır; böylece cache indirimi tasarruf olarak iki kez sayılmaz
Kütüphane kullanımı
import { renderTextToPngs, transformAnthropicMessages } from "pxpipe";
const imgs = await renderTextToPngs(toolResultText); // RenderedImage[]
const { body, applied, info } = await transformAnthropicMessages({
body: requestBytes,
model: "claude-fable-5",
});
- Proxy olmadan kütüphane olarak da kullanılabilir
options.keepSharp(block) belirli bir bloğu metin olarak sabitler
options.emitRecoverable görselleştirilmiş bloğun orijinalini döndürür
- Runtime Pure JS’tir ve Node ile edge/Workers’ı destekler
@napi-rs/canvas yalnızca build time’da kullanılır
- Tüm API
src/core/index.ts içindedir
Gerçek başarısızlıklar ve sınırlar
- Birkaç haftalık günlük kullanım sırasında bir kez, görselleştirilmiş sohbet geçmişinden bir insan adını hatırlarken kendinden emin şekilde yanlış verdiği bir vaka oldu
- Kodlama oturumları düzenleme öncesinde dosyayı tekrar okuduğu için bu failure mode’a dayanabilir, ancak saf sohbet hatırlamasında aynı doğrulama yoktur
- legibility audit, render sayfasındaki tam string hatırlamayı ölçer
- Yoğun identifier’larda blind read en fazla %63’tü
- Tüm miss’ler glyph-confusability matrix ile öngörüldü
- API resample cap’e uymak için page geometry’yi sınırlayan bir hafifletme uygulandı
- SHA ve sayılar gibi exact identifier’lar metin olarak birlikte taşındı
- Sınırlamalar da belirtilmiş
- Görsel tabanlı verbatim recall güvenilir değildir
- Büyük isteklerde gönderim öncesi PNG encoding gecikmesi eklenir
- ASCII/Latin-1 iyi test edilmiştir
- CJK çalışır, ancak muhafazakâr şekilde ele alınır
Geliştirme ve yol haritası
pnpm install && pnpm test
pnpm run build # regenerates dist/
- Geliştirme komutları kurulum-test ve build’den oluşur
- Lisans MIT’dir
- Yol haritası yalnızca hipotez olarak sunulur; sayı ve örneklem büyüklüğü eklenmedikçe claim olarak ele alınmaz
- Daha keskin glyph rendering
- Görselleştirilmiş bulk’ın aynı 1M window’da etkili bağlamı yaklaşık 2 kat artırıp artıramayacağı
- Daha küçük active context’in uzun görev doğruluğunu artırıp artırmayacağı
1 yorum
Hacker News yorumları
Gemini’ye bakınca bile, PDF işlerken önce OCR yaptığını, ardından metin ve görselleri modele birlikte verdiğini ve metin token maliyetini ücretlendirmediğini biliyorum.
Claude arka ucu da aynı şeyi yapıyorsa, bu hack token ücretlendirme yöntemindeki bir açıktan ibaret sayılır; Claude Gemini gibi davranıyorsa ileride kapatılma ihtimali yüksek.
Ama aşağıdaki yorumda DeepSeek’in görsel token’larla sıkıştırma oranını ciddi ölçüde iyileştirdiğinden bahsediliyor: https://news.ycombinator.com/item?id=48777848
İç teknik ayrıntıları tamamen anlamadığım için OCR yolunun toplam güç ya da hesaplama maliyeti düşüşüne nasıl yol açabileceğini hâlâ pek kavrayamıyorum.
Bir görseli LLM’e vermenin bir yolu, görseli parçalara bölmek, bu parçaları bir vision encoder sinir ağından geçirerek görsel token’lar üretmek ve sonra bunları metin token’ları gibi LLM’e girdi olarak vermektir. Elbette vision encoder ile LLM’in birbirini anlayacak şekilde eğitilmesi gerekir. Bu tür yaklaşıma uçtan uca OCR modeli denir.
Böyle eğitilmiş bir modeliniz olduğunda, belge görselini büyütüp küçülterek aynı metin belgesini temsil etmek için kullanılan görsel token sayısını değiştirebilir; yama boyutu veya vision encoder karmaşıklığı gibi parametreleri de ayarlayabilirsiniz.
Sonuçlar oldukça iyiydi; bazı testlerde giriş token’larını %90 azaltırken çıktı performansının %97’si korunmuş.
Geçen yıl OpenAI modelleriyle aynı şeyi denemiştim; o dönemde prompt token’larını azaltmada işe yarıyordu ama completion token’larına çok daha fazla ihtiyaç duyduğu için sonuçta daha pahalı ve daha yavaş oluyordu.
https://pagewatch.ai/blog/post/llm-text-as-image-tokens/
Ah, gözlerim acıdı. Vibe coding ile yazılmış bir README gibi.
Örneğin:
Yapay zekayla gerçekten faydalı şeyler yapılabilir; özellikle zaten uzmanlığınız olan bir alandaysa bu daha da geçerli. Ama o zaman 1) yapay zekadan yardım aldığınızı belirtmeli ve 2) tam olarak ne yaptığınızı kendi sözlerinizle açıklamalısınız. Yapay zekayla çalışmanın sınırlarından da bahsedebiliyorsanız daha iyi.
Ancak o zaman “Bu kişinin yaptığı şey kurcalamaya değer, ne yaptığını iyi anlıyor” güveni oluşur.
Bugün çıkan şeylerin %99’u, insanların hiç anlamadıkları alanlarda çalışmasının sonucu; böyle bir README görünce doğrudan sekmeyi kapatıyorum.
Bu, kaynakları yakıp tüketen bir fiyatlandırma hack’i gibi görünüyor. Açık kapatılınca OCR fiyatının artması gerekmez mi?
Düşününce mantıklı. İnsanlar da kodu kelime kelime okur, ama çoğunlukla göz gezdirip örüntü tanımayla kabaca ne yaptığını anlar. Yalnızca belirli bir soruya yanıt vermek gerektiğinde belirli kısımlara odaklanır.
İnsanların da doğal olarak benzer bir dolambaçlı optimizasyon yaptığı söylenebilir.
İlgili yazı: https://blog.can.ac/2026/06/10/snapcompact/
Bu yöntemde dikkatli olmak gerek. Maliyetin düşmesinin nedeni aslında daha düşük performanslı başka bir modele geçilmesi olabilir.
Dışarıdan Fable gibi görünebilir ama gerçekte öyle olmayabilir. Bu durumda boşuna ek iş yapmış olursunuz; modeli opus 4.8’e geri almak daha iyi olabilir.
Oh-My-Pi (OMP.sh) bağlam sıkıştırma için görselleri kullanıyor gibi. OMP, Pi coding agent’ın üzerine inşa edilmiş.
Bu teknik hakkında DeepSeek teknik incelemesi de var: https://www.seangoedecke.com/text-tokens-as-image-tokens
Eskiden birinin tweet’ini görmüştüm; muhtemelen Carmack, Geohot veya Karpathy’den biriydi ve görseller daha iyi bir seçenek olabilir mi diye soruyordu.
O zamandan beri ajana şu anda ne olduğunu anlatırken çok basit cümlelerden oluşan bir prompt ile birlikte görseller kullanıyorum; bazen prompt’a hiç metin koymadığım da oluyor.
Etkisi çok iyi oldu.
Yalnız bu, Karpathy’nin kastettiği şeyle tam olarak aynı değil. Yine de o fikir daha iyi bir iş akışına götürdü.
Kusura bakmayın ama bu saçmalık. Çalışıyor ve akıllıca, ama açıkça bir fiyatlandırma başarısızlığını aşmanın yolu.
Kobra ödülleri yüzünden insanların yılan yetiştirmeye başlaması gibi, bu da israfı kullanıyor ve teşvik ediyor.
Sonuçta bu arbitrajı mümkün kılan kötü fiyatlandırma sisteminden Anthropic’in sorumlu olduğunu düşünüyorum. Ama düzeltilene kadar insanların bunu istismar etmek için üşüşmesi ve tamamen gereksiz dijital çöpün daha da artacak olması mide bulandırıcı.