Benchmark
Bir geliştiricinin gerçekten yazacağı sekiz prompt, aynı Next.js uygulamasına üç kez soruldu — bir kez bugün bir agent’ın kod tabanında arama yaptığı gibi, bir kez bu sunucunun ücretsiz paketinde, bir kez Pro’da. Her adım gerçekten çalıştırıldı ve gerçek çıktısı ölçüldü. Koşu tarihi: 2026-09-14.
Proje dubinc/dub: açık kaynak ve 3.593 kaynak dosya. Bilinçli olarak ne bizim kodumuz ne de bir müşterinin kodu — klonlayıp bu sayfadaki her rakamı kendiniz kontrol edebilirsiniz. Yayımlanmaya değer tek benchmark türü de budur.
- 16.372
- arayarak bulmanın token maliyeti
- 293
- ücretsiz pakette token
- 56×
- görev başına daha az context
- 6/8
- Ücretsiz pakette doğru dosya — arama 8’de 6 buldu
Hangi soruyu yanıtlıyor
“Bu agent daha mı akıllı” değil — bu, kimsenin güvenmesi gereken bir şekilde ölçülebilir değil. Soru daha dar ve yanıtlanabilir: bir görevi sahiplenen dosya masaya gelene kadar modele ne kadar context girmek zorunda? Bu maliyet her prompt’ta, her agent tarafından, daha hiçbir iş başlamadan ödenir; bu sunucunun var oluş sebebi de onu ortadan kaldırmaktır.
Proje
dub bir bağlantı yönetimi ürünü: 3.593 TypeScript ve TSX dosyası, Next.js App Router, host üzerinden yönlendirilen birkaç alan adı ve büyük bir kurumsal alt ağaç. Oyuncak bir depo değil — elli dosyalık bir projede hiçbir keşif stratejisinin maliyeti yoktur ve fark ancak geliştiricilerin gerçekten yardım istediği boyutta ortaya çıkar.
Ayrıca bizim için zor bir vaka ve bunu bilerek seçtim. İçindeki her şey sade İngilizceyle adlandırılmış, yani grep elinden gelenin en iyisini yapıyor; çeviri dosyası da yok, yani bu sunucunun bir projenin alan sözlüğünü kendi i18n dosyalarından öğrenme yeteneği hiç devreye girmiyor. Burada gördüğünüz fark, karşı tarafa yarayan bir kod tabanındaki fark.
Her iki taraf nasıl çalıştırıldı
Arayarak bulmak. Bir agent’ın izlediği sırayla dört adım: istekteki isimlerle glob; geliştiricinin kendi cümlesiyle grep; o cümle hiçbir şey döndürmediğinde — ki olağan olan budur, çünkü insanlar davranışı tarif eder, kod ise şeylere isim verir — kelimeleri tek tek grep; sonra en umut verici 3 dosyayı oku. Adaylar, bir insanın neyi açacağına karar verdiği gibi, yolun istekteki kelimeleri ne kadar yankıladığına göre sıralanır.
Bu sıralama adımı önemli ve bilinçli olarak eklendi: ham grep sonuçlarını çıktıkları sırayla okumak çok daha zayıf bir karşılaştırma tarafı ve çok daha göz alıcı bir grafik üretiyordu. Bir karşılaştırma ancak karşı tarafa en iyi şansı verildiyse yayımlanabilir. Bu adımla birlikte arama doğru dosyayı 8 görevin 6 tanesinde, bu sunucu ise 8 görevin 6 tanesinde buluyor — ücretsiz pakette berabere, üstelik aynı görevlerde de değil. Pro 7 tanesini buluyor. Buradaki iddia isabet değil, maliyet hakkında.
Bir cevap anahtarı sonradan genişletildi ve bunu söylemeye değer. Tarih aralığı görevinde iki taraf da aynı tarih aralığı bileşenini döndürdü, oysa anahtar onu listelememişti; yanlış olan taraflardan biri değil anahtarın kendisiydi ve düzeltme puanı iki tarafa da verdi.
Bu sunucuya sormak. Aynı cümleyle tek bir resolve_task_context çağrısı ve yanıtın tamamı sayıldı — özet, dosyalar, kurallar, doğrulama komutları, context penceresine girecek her bayt. Aynı sunucu ikilisiyle, her paket için bir kez olmak üzere iki kez çalıştırıldı.
Sayım. Gerçek çıktının karakter sayısı 4’e bölündü. Arama, rg çağırmak yerine süreç içinde çalışıyor; böylece rakamlar o araca sahip olmayan bir makinede de tekrarlanıyor. Bir görev, değişikliği gerçekten sahiplenen dosya döndürülen dosyalar arasındaysa doğru sayılıyor.
Her görev, iki taraf da
Her iki tarafın döndürdüğü dosyalar, döndükleri hâliyle listelenmiştir. İlginç satırlar, cümle grep’inin hiçbir şeye mal olmadığı ve kelime kelime geri düşüşün her şeye mal olduğu satırlar.
Kısa bağlantıyı kopyalayan butonu nereden değiştiriyorum?
arayarak bulmak3.120
- glob *button*755
- grep "copy button" + "copy short link"141
- 3 dosya okundu2.224
dönen dosyalarsahiplenen dosya içinde
- app/app.dub.co/(deeplink)/deeplink/[domain]/[[...key]]/action-button.tsx
- ui/links/link-builder/link-feature-buttons.tsx
- ui/links/link-builder/utm-templates-button.tsx
bu sunucuya sormak (ücretsiz paket)307
dönen dosyalarbulamadı
- app/app.dub.co/(deeplink)/deeplink/[domain]/[[...key]]/action-button.tsx
- ui/customers/customers-table/customers-table.tsx
- app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/referrals/page-client.tsx
QR kod penceresinin yanlış boyutta indirdiği hatayı düzelt
arayarak bulmak21.197
- glob *modal*2.217
- grep "qr code modal" + "qr code download"0
- kelimeleri tek tek grep (cümle bulunamadı)15.132
- 3 dosya okundu3.848
dönen dosyalarbulamadı
- ui/modals/add-discount-code-modal.tsx
- ui/modals/delete-discount-code-modal.tsx
- ui/modals/invite-code-modal.tsx
bu sunucuya sormak (ücretsiz paket)267
dönen dosyalarsahiplenen dosya içinde
- ui/modals/qr-code-design-fields.tsx
- app/api/qr/route.tsx
- lib/qr/codegen.ts
Sekme değiştirince analiz tarih aralığı seçimi sıfırlanıyor
arayarak bulmak30.706
- glob *picker*55
- grep "date range picker" + "analytics date range"0
- kelimeleri tek tek grep (cümle bulunamadı)27.446
- 3 dosya okundu3.205
dönen dosyalarsahiplenen dosya içinde
- ui/shared/simple-date-range-picker.tsx
- app/api/analytics/dashboard/route.ts
- app/api/analytics/export/route.ts
bu sunucuya sormak (ücretsiz paket)287
dönen dosyalarsahiplenen dosya içinde
- ui/shared/simple-date-range-picker.tsx
- app/(ee)/admin.dub.co/(dashboard)/revenue/page.tsx
- app/(ee)/admin.dub.co/(dashboard)/payouts/page.tsx
Bağlantılar tablosuna bir sütun ekle
arayarak bulmak27.782
- glob *table*665
- grep "links table" + "links table column"0
- kelimeleri tek tek grep (cümle bulunamadı)26.270
- 3 dosya okundu847
dönen dosyalarbulamadı
- app/(ee)/admin.dub.co/(dashboard)/links/page.tsx
- app/(ee)/api/admin/links/ban/route.ts
- app/(ee)/api/admin/links/count/route.ts
bu sunucuya sormak (ücretsiz paket)313
dönen dosyalarbulamadı
- ui/customers/customers-table/customers-table.tsx
- app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/earnings/earnings-table.tsx
- app/(ee)/partners.dub.co/(dashboard)/programs/[programSlug]/(enrolled)/customers/(index)/page.tsx
Özel alan adı doğrulama akışı nerede uygulanmış?
arayarak bulmak4.156
- glob *verification*154
- grep "domain verification" + "verify domain"936
- 3 dosya okundu3.066
dönen dosyalarsahiplenen dosya içinde
- ui/modals/domain-verification-modal.tsx
- app/(ee)/api/cron/email-domains/verify/route.ts
- app/api/domains/[domain]/verify/route.ts
bu sunucuya sormak (ücretsiz paket)286
dönen dosyalarsahiplenen dosya içinde
- app/api/domains/[domain]/forward-instructions/route.ts
- ui/modals/domain-verification-modal.tsx
- app/api/domains/[domain]/verify/route.ts
Faturalandırma sayfasındaki paket yükseltme butonu hiçbir şey yapmıyor
arayarak bulmak35.172
- glob *button*755
- grep "upgrade plan button" + "billing upgrade"0
- kelimeleri tek tek grep (cümle bulunamadı)25.496
- 3 dosya okundu8.921
dönen dosyalarsahiplenen dosya içinde
- app/app.dub.co/(dashboard)/[slug]/(ee)/settings/billing/upgrade/page.tsx
- ui/workspaces/upgrade-plan-button.tsx
- app/api/workspaces/[idOrSlug]/billing/upgrade/route.ts
bu sunucuya sormak (ücretsiz paket)294
dönen dosyalarsahiplenen dosya içinde
- app/app.dub.co/(dashboard)/[slug]/(ee)/settings/billing/upgrade/page.tsx
- playwright/workspaces/billing-mocks.ts
- app/api/workspaces/[idOrSlug]/billing/upgrade/route.ts
Bir etiketin alabileceği renkleri nereden düzenliyorum?
arayarak bulmak4.621
- glob *color*70
- grep "tag color" + "tag colours"111
- 3 dosya okundu4.440
dönen dosyalarsahiplenen dosya içinde
- ui/modals/add-edit-tag-modal.tsx
- app/app.dub.co/(dashboard)/[slug]/(ee)/program/resources/program-brand-assets/add-color-modal.tsx
- ui/colors.ts
bu sunucuya sormak (ücretsiz paket)301
dönen dosyalarsahiplenen dosya içinde
- ui/modals/add-edit-tag-modal.tsx
- app/app.dub.co/(dashboard)/[slug]/links/tags/page-client.tsx
- app/app.dub.co/(dashboard)/[slug]/(ee)/program/bounties/add-edit-bounty/audience-eligibility-panel.tsx
Ekip davet formu, e-posta zaten davet edilmişken hata göstermiyor
arayarak bulmak4.221
- glob *teammates*10
- grep "invite teammates" + "already invited"502
- 3 dosya okundu3.709
dönen dosyalarsahiplenen dosya içinde
- ui/workspaces/invite-teammates-form.tsx
- ui/modals/invite-partner-user-modal.tsx
- ui/modals/invite-workspace-user-modal.tsx
bu sunucuya sormak (ücretsiz paket)286
dönen dosyalarsahiplenen dosya içinde
- app/api/workspaces/[idOrSlug]/invites/route.ts
- ui/workspaces/invite-teammates-form.tsx
- app/app.dub.co/(dashboard)/[slug]/(ee)/settings/members/page.tsx
Ücretsiz ve Pro
Bir projedeki her dosya, her pakette adı ve yolu ile indekslenir. İndeksin hiç duymadığı bir dosya hiçbir fiyata döndürülemez, dolayısıyla ücretli paketlerin sattığı şey bu değildir — ve bu sunucunun daha eski bir sürümü onu kazara satıyordu: yürüyüşü ücretsiz paket tavanında, daha ilk dizinin ortasında duruyordu. dub’da bu, koca bir bileşen dizinini görünmez bırakmıştı.
Paketin yükselttiği şey kaç dosyanın içinin okunduğudur. Ücretsiz paket bunlardan 500’ünü, ilk bulunanları değil ağacın tamamına yayılanları seçerek okur ve her cevap bunu söyler. dub’da bu tam olarak 8 görevde bir görev ediyor: ücretsiz 6, Pro 7 buluyor. Dönen görev, sahiplenen bileşenin indekste adıyla bulunduğu ama içinin okunmadığı kopyala-butonu görevi — yani Pro dosyanın söylediğinden, ücretsiz paket ise adından cevap veriyor.
Pro ayrıca 293 yerine 237 token’da yanıtlıyor, çünkü çekinecek daha az şeyi var. Yine de ödeme yapma sebebi etki analizi, bağımlılık panosu ve kopya tespiti olmalı. Sekizde bir görev gerçek bir fark, bulunabilmenin önüne konmuş bir ücret değil.
Bu ne demek
Günde 12 agent görevi ve yirmi bir iş günü üzerinden, yalnızca keşif aylık $20.63 tutuyor; ücretsiz pakette ise $0.37.
Bu dolar tutarları, benchmark’ın çalıştığı gün Claude Opus 5 girdi fiyatıyla (milyon token başına $5.00) fiyatlandırılmış token sayılarıdır. Model fiyatları değişir ve kullandığınız model bu olmayabilir — ölçüm token’lardır, dolar ise onu okumanın bir yoludur.
Prompt cache bu farkı kurtarmıyor. Cache, prompt’lar arasında tekrar eden metinde işe yarar — talimat dosyası tam olarak odur ve ilk isabetten sonra gerçekten ucuzlar. Arama çıktısı ise tam tersi: farklı sorgu, farklı sonuçlar, yapısı gereği her prompt’ta cache’lenemez. O 16.372 token her seferinde tam fiyattan ödenir.
Bunun göstermediği şeyler
- Tek kod tabanı, sekiz görev. dub, tek bir adlandırma alışkanlıkları olan tek bir proje. Ölçüm aracı paketle birlikte geliyor, böylece sizinkinin ne yaptığını öğrenebilirsiniz.
- Ücretsiz pakette isabet berabere. Arama ve ücretsiz paket 8 görevin 6 tanesini buluyor, üstelik kısmen farklı görevlerde. Pro 7 tanesini buluyor. Bu sayfanın manşet iddiası isabet değil, maliyet.
- Bir oturum kaydı değil. Ölçülen şey soruyu yanıtlamak için gereken context; bir agent’ın bir öğleden sonra harcadığı miktar değil. Gerçek bir koşu modele, prompt’a ve örnekleyicinin keyfine göre değişir — o daha iyi bir manşet, daha kötü bir benchmark olurdu.
- Yalnızca keşif. Değişikliği yazarken harcanan token her iki durumda da aynı. Burada bunun aksi iddia edilmiyor.
- Çıktı token’ları hariç. Yalnızca context penceresine giren sayılıyor, girdi fiyatıyla.
Kendi projenizde çalıştırın
Önce bu sayfayı yeniden üretin. Ölçüm aracı da kullanılan görev listesi de depoda, yani yukarıdaki rakamlar sizin makinenizde değişmeden geri gelmeli.
git clone --depth 1 https://github.com/dubinc/dub
npm run benchmark ./dub/apps/web benchmark/tasks.dub.json
Sonra kendi prompt’larınızı getirin. Yukarıdaki sekiz görev dub’ı tarif ediyor; onları farklı bir kod tabanında çalıştırmak, projenizin başkasının kelime dağarcığına ne kadar benzediğini ölçerdi — kimsenin sormadığı bir soru. Kendinize ait sekiz prompt fazlasıyla yeter.
npm run benchmark /path/to/your/next-app ./my-tasks.json
[
{
"id": "checkout-total",
"prompt": "Fix the bug where the checkout total ignores the discount code",
"searchTerms": ["checkout total", "discount code"],
"expectPathContains": ["checkout"]
}
]
prompt gerçekten yazacağınız şeydir — bir belirti, dosya adı değil. searchTerms ilk grep’leyeceğiniz cümledir ve karşılaştırma tarafının en iyi şansıdır, o yüzden gerçeğini verin. expectPathContains görevi sahiplenen modüldür; dönen bir yol onu içeriyorsa koşu doğru sayılır.
Prompt’ları, iki tarafın nasıl sonuç vereceğini bilmeden önce yazın. Sonradan seçmek bir benchmark’ı demoya çevirir. Hiçbir şey makinenizden dışarı çıkmaz.
Koşu deterministik — model çağrısı yok, ağ yok, örnekleme yok. Değişmemiş bir checkout üzerinde iki koşu bayt bayt aynı dosyayı üretir; bu sayfadaki rakamları yalnızca alıntılanabilir değil denetlenebilir kılan da budur.
Kurun ve ilk rakamı kendiniz doğrulayın
Ücretsiz paket keşif sorusunu anılmaya değer bir sınır olmadan yanıtlıyor. Yukarıdaki ölçüm zaten ücretsiz paketin ölçümü.