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
  • resolve_task_context307
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
  • resolve_task_context267
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
  • resolve_task_context287
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
  • resolve_task_context313
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
  • resolve_task_context286
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
  • resolve_task_context294
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
  • resolve_task_context301
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
  • resolve_task_context286
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

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.

terminal
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.

terminal
npm run benchmark /path/to/your/next-app ./my-tasks.json
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ü.