· kaynak dev.to (home feed)
Rust tabanlı CLI urai-ecma, LLM token israfını azaltmak için JS/TS kod tabanlarını %80 küçülttüğünü iddia ediyor
Bir geliştiricinin Rust ile yazdığı CLI aracı, JavaScript ve TypeScript kodlarını söz dizimi ağaçlarına ayrıştırıp markup gürültüsünü ayıklayarak, 209.757 token'lık bir kod tabanını LLM prompt'ları için yaklaşık 36.000 token'a düşürüyor.

Rust CLI, LLM prompt'ları için JS/TS depolarını sıkıştırıyor
dev.to üzerinde sanjaiyan_dev kullanıcı adıyla paylaşım yapan bir geliştirici, JavaScript ve TypeScript kod tabanlarını büyük dil modellerine verilmeden önce küçülten, Rust ile yazılmış çok iş parçacıklı bir komut satırı aracı olan urai-ecma'yı geliştirdi. Paylaşıma göre araç, 209.757 ham token ölçen bir kod tabanını yaklaşık 36.000 token'a — %82,7'lik bir azalma ile — milisaniyeler içinde sıkıştırdı.
Yazar, motivasyonun yerel LLM'lerle çalışan agent tabanlı bir Chrome uzantısı geliştirmekten geldiğini söylüyor. Tüm depoyu tek seferde vermek her taramayı 200.000 token'ın üzerine çıkarıyor, yerel çıkarımı şaşırtıcı derecede yavaşlatıyor ve yazarın anlattığına göre, temel mimari arayüzler tekrarlayan markup ve döngülerin altında gömülü kaldığı için model temel fonksiyonları var sayıyordu (halüsinasyon görüyordu).
Tüm bir depoyu dökmenin bedeli
Paylaşım, tipik bir React veya Next.js deposu bir prompt'ta birleştirildiğinde token'ların %70'inden fazlasının ölü ağırlık olduğunu savunuyor: uygulama mimarisi hakkında pek bir şey söylemeyen uzun statik Tailwind utility sınıf dizileri, imperatif döngüler, array mapper'ları ve formatlama mantığı. Yazara göre bunun dört maliyeti var: kritik arayüzlerin aşırı büyük prompt'ların ortasında kaybolmasıyla dikkat bozulması; prefill işlemi prompt boyutuyla ölçeklendiği için ilk token'a kadar geçen sürenin uzaması; 80 karakterlik sınıf dizilerini yutturmak için frontier model API ücretleri ödemek — yazarın deyişiyle bir "Tailwind vergisi"; ve CI pipeline'larında dakika başına token kotalarının daha hızlı tükenmesi.
Birleştirme yerine AST-farkındalı budama
Repomix, gitingest ve code2prompt gibi araçlar, yazarın tanımlamasıyla dosya dökücülerdir: bir dizini gezer, ham metni fence'lerin içine sarar ve her satırı modele iletir. urai-ecma farklı bir yol izliyor: kaynak dosyaları swc_ecma parser motoruyla soyut söz dizimi ağaçlarına (AST) ayrıştırıyor ve ardından deterministik dönüşümler uyguluyor.
Pipeline şöyle çalışıyor: Rust tabanlı ignore desteğiyle yapılan bir dizin gezintisi .gitignore dosyasına saygı gösteriyor ve node_modules ile dist klasörlerini atlıyor; dosyalar (.ts, .tsx, .js, .mjs ve .) Rayon'un work-stealing özelliğiyle CPU çekirdeklerinde paralel olarak ayrıştırılıyor; ve bir dizi AST visitor yalnızca önemli olanı çıkarıyor. Bir RouteVisitor, Next.js, Express ve NestJS için route tabloları oluşturuyor; bir ReactComponentAnalyzer props, state, hook ve JSX yapısını yakalıyor; bir ReactJsxPruner statik sınıf dizilerini ayıklıyor; ve bir FunctionSummarizerVisitor fonksiyon gövdelerini stub'lara indiriyor. Sonuçlar, SHA-512/256 hash'leme ve Zstd sıkıştırması içeren hibrit bir disk ve RAM önbelleğinden (Foyer) geçiyor ve araç, o200k BPE tokenizer ile sayılmış bir token raporuyla birlikte bir Markdown prompt üretiyor.
Orta yol olarak yapısal stub'lama
En ilginç tasarım kararı, yazarın yapısal stub'lama (structural stubbing) dediği şey. Düz minifikasyon bir seçim dayatıyor: ya fonksiyon gövdelerinin tamamını tutup döngüler ve aritmetik için token harcayacaksınız, ya da yalnızca imzalara indirgeyip hook'ları, event listener'ları ve yerleşimi kaybedeceksiniz. Bunun yerine stub'lama aşaması AST ifadelerini inceliyor ve yalnızca bir bileşenin anatomisini tanımlayanları koruyor: iç içe fonksiyon bildirimleri, arrow function veya fonksiyon ifadelerine atanmış değişkenler, hook çağrıları ("use" ile başlayan tanımlayıcılar), setTimeout, setInterval ve addEventListener gibi zamanlayıcılar ve listener'lar, ve JSX hiyerarşileri taşıyan return ifadeleri. Gövdedeki diğer her şey atılıyor.
İsim, klasik Tamil bilgelğine bir selam: urai ezhuthudhal, Thirukkuṛaḷ gibi eserler üzerine yoğun yorumlar yazma geleneği; yorumcular derinliği yok etmeden yapıyı ve amacı damıtırlardı. Yazarın yazdığına göre araç, modern kurumsal JavaScript için aynısını yapmayı hedefliyor.
Akılda tutulması gereken uyarılar
Tüm rakamlar, dev.to'da yayınlanan ve bağımsız olarak doğrulanmamış, yazarın kendi projesi üzerinde yapılmış tek bir kendinden bildirilen benchmark'tan geliyor. Azaltma oranı ayrıca kod tabanının biçimine göre değişecektir: uzun sınıf dizileri içeren markup ağırlıklı React bileşenleri çarpıcı biçimde sıkışırken, az bileşen içeren yoğun mantıklı servislerde ayıklanacak çok daha az şey var. Ve her özetleme yaklaşımında olduğu gibi, stub'lama uygulama detayını atıyor; bu da bir modele sorduğunuz soru çevresindeki mimari yerine tek bir fonksiyonun iç yapısıyla ilgiliyse önem taşıyor.
Neden önemli
Kodlama agent'ları rutin altyapı hâline geldikçe prompt boyutu doğrudan bir maliyet kalemi haline geliyor: token harcamasını, ilk token'a kadar geçen süre gecikmesini ve rate-limit davranışını belirliyor. urai-ecma, bağlamı kesme yoluyla değil semantik olarak sıkıştırmak için olgun derleyici araçlarını — Rust, SWC, paralel ayrıştırma — yeniden amaçlandırmanın erken bir örneği; modellere maliyetin çok küçük bir bölümüyle mimari farkındalık kazandırıyor. Bu aralıkta azaltmalar gerçek kod tabanlarında da tutarsa, bu tür ön işlemlerin agent pipeline'larında standart bir adım olması muhtemel; ve yaklaşım, bu particular CLI'yi benimseyip benimsemediklerine bakılmaksızın diğer araç geliştiricilerinin ödünç alabileceği bir şey.
- #rust
- #llms
- #developer-tools
- #cli
- #typescript
İlgili yazılar
- Kırmızı takım uzmanının üç maddelik kontrol listesi, çoğu MCP server incelemesinin gözden kaçırdığı güvenlik açıklarını hedefliyor
- TokenPrint: token'ları transformer'lar boyunca izleyen açık kaynaklı bir 3D debugger
- Liniora, geliştiriciler için ticket'ları, PR'ları ve ekip kararlarını birleştiren AI çalışma alanını duyurdu