
Mon Sep 07 2026

Yazarken aklınızda bulunsun: ** neden token maliyetlerini karşılaştırdığımızı** ve bunun sizin için ne anlama geldiğini her zaman açıklayacağız.
// TSX örneği – tür bilgisi ekler, ekstra token harcar
const Greeting = ({ name }: { name: string }) => (
<div>Merhaba, {name}!</div>
);
// Pug örneği – daha az token, temiz ve sade
div Merhaba, #{name}!
<!-- HTML örneği – sabit token sayısı -->
<div>Merhaba, {{name}}!</div>
// JSX örneği – TSX ile benzer, tür bilgiği yok
function Greeting(props) {
return <div>Merhaba, {props.name}!</div>;
}
Böylece ne oluyor? Token maliyetlerini anlamak, LLM'lerle kod üretirken bütçe dostu seçimler yapmanızı sağlar. Daha az token → daha az para, daha hızlı döngüler ve daha iyi bir geliştirme deneyimi. Bu karşılaştırma, sadece kuru verileri değil, aynı zamanda belirli projelere yönelik somut öneriler sunarak işe yarar.
Token maliyetini gerçekçi ölçmek için şu üç bileşeni birleştirdik 👇
Araçlar
tiktoken – OpenAI tokenizasyonu için hafif Python kütüphanesi 🎯requests – API çağrıları ve yanıt sürelerini yakalamak için 🔁pandas – Sonuçları tabloya döküp CSV’ye yazmak için 📊Veri kümeleri
Ölçüm yöntemi
tiktoken ile hesapla.import os
import tiktoken
import requests
import pandas as pd
# 1️⃣ Model ve fiyat sabitleri
MODEL = "gpt-4o-mini"
PRICE_PER_1K = 0.00015 # $ per 1K token (örnek)
# 2️⃣ Tokenizer
enc = tiktoken.encoding_for_model(MODEL)
def count_tokens(text: str) -> int:
return len(enc.encode(text))
def call_api(prompt: str) -> dict:
headers = {
"Authorization": f"Bearer {os.getenv('OPENAI_API_KEY')}",
"Content-Type": "application/json",
}
payload = {
"model": MODEL,
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 2000,
"temperature": 0,
}
resp = requests.post(
"https://api.openai.com/v1/chat/completions",
headers=headers,
json=payload,
timeout=30,
)
resp.raise_for_status()
return resp.json()
def measure(prompt: str, runs: int = 10) -> dict:
prompt_tok = count_tokens(prompt)
total_cost = 0.0
total_comp_tok = 0
for _ in range(runs):
data = call_api(prompt)
comp = data["choices"][0]["message"]["content"]
comp_tok = count_tokens(comp)
total_comp_tok += comp_tok
total_cost += (prompt_tok + comp_tok) * PRICE_PER_1K / 1000
return {
"prompt_tokens": prompt_tok,
"avg_completion_tokens": total_comp_tok / runs,
"avg_cost_usd": total_cost / runs,
}
# 3️⃣ Test verileri
samples = {
"kisa": "Merhaba, nasılsın?",
"orta": " " .join(["Bu bir örnek metindir."] * 150), # ~1.5k token
"uzun": " " .join(["Uzun bir teknik doküman satırı."] * 500), # ~5k token
}
results = []
for name, txt in samples.items():
print(f"🔎 {name} ölçülüyor…")
m = measure(txt)
m["sample"] = name
results.append(m)
df = pd.DataFrame(results)
df.to_csv("token_cost_report.csv", index=False)
print("✅ Rapor kaydedildi → token_cost_report.csv")
Bu sayede ne oluyor?
tiktoken ile yerel token sayısı alıyoruz, ağ gecikmesinden etkilenmiyor.token_cost_report.csv dosyasına yazılıp daha sonra grafikleştirilebilir 📈.pip install tiktoken requests pandasOPENAI_API_KEY ortam değişkenine ekle.measure_cost.py olarak kaydet ve python measure_cost.py çalıştır.⚡ İpucu: Farklı modeller için PRICE_PER_1K ve MODEL sabitlerini değiştirerek aynı betikle karşılaştırma yapabilirsin.
Hazırsan bir sonraki bölümde bu verileri görselleştirip yorumlayabiliriz 🚀
Hazırsan başlayalım 🚀
LLM’lere gönderilen prompt uzunluğu, doğrudan token maliyetine (ve dolayısıyla faturaya) etki eder. Farklı işaretleme dilleri aynı bileşeni ifade ederken token sayısı açısından büyük farklar yaratır. Aşağıda benim kendi deneyimlerimde gördüğüm ortalama değerleri paylaşıyorum — tabii ki projenize göre değişebilir, ama trend aynen böyle.
| Format | Örnek Bileşen (basit bir kart) | Token Sayısı | Pug’a Göre Fark |
|---|---|---|---|
| Pug | div.card\n h2 Başlık\n p Açıklama |
≈ 30 | %0 (referans) |
| HTML | <div class="card"><h2>Başlık</h2><p>Açıklama</p></div> |
≈ 45 | +50 % |
| JSX | <div className="card"><h2>Başlık</h2><p>Açıklama</p></div> |
≈ 55 | +83 % |
| TSX | <div className="card"><h2>Başlık</h2><p>Açıklama</p></div> (tipler dahil) |
≈ 58 | +94 % |
Ne anlıyoruz?
- Pug en kompakt, çünkü sözdizimi minimal.
- HTML biraz daha uzun (açılış/kapanış etiketleri).
- JSX ve TSX aynı görünümlü ama className, type annotation’ları vs. token sayısını yukarı çeker.
- TSX, tip tanımlamaları sayesinde Pug’a göre %94 daha pahalı çıkıyor.
Bu fark binlerce bileşen içeren bir projeye ölçeklendirildiğinde onbinlerce token (yani ciddi maliyet) farkı yaratır. Özellikle streaming veya real‑time LLM çağrıları yapıyorsanız, her token önemli 💸.
Aşağıdaki Python parçası, bir şablon string’ini alıp tiktoken ile token sayısını döndürür. Kendi bileşenlerinizle deneyerek tabloyu güncelleyebilirsiniz.
import tiktoken
def token_sayisi(metin: str, model: str = "gpt-4o") -> int:
"""Verilen metnin token sayısını döndürür."""
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(metin))
# Örnek kullanım
pug = "div.card\n h2 Başlık\n p Açıklama"
html = '<div class="card"><h2>Başlık</h2><p>Açıklama</p></div>'
jsx = '<div className="card"><h2>Başlık</h2><p>Açıklama</p></div>'
tsx = '<div className="card"><h2>Başlık</h2><p>Açıklama</p></div>'
for fmt, kod in [("Pug", pug), ("HTML", html), ("JSX", jsx), ("TSX", tsx)]:
print(f"{fmt:4} → {token_sayisi(kod)} token")
Nasıl çalışıyor?
tiktoken.encoding_for_model ile modelin tokenizer’ını yüklüyoruz.encode metodu metni token’lara böler.len ile token sayısını alıyoruz.Bu sayede hangi formatın sizin için en uygun olduğunu (hem okunabilirlik hem maliyet) veriyle karar verebilirsiniz ✅.
Özetle:
Hadi bir deneme yapalım ve kendi bileşenlerinizle tabloyu güncelleyelim! 🚀
Hazırsan bu kısımda hangi formatın ne zaman en ekonomik olduğunu, pratik bir tablo ve kod örnekleriyle özetleyelim 🎯
| Senaryo | Tercih Edilecek Format | Neden? |
|---|---|---|
| Sık değişen, küçük veriler (config, feature flag) | JSON | Parse hızlı, insan okunabilir, her dilde native destek 🚀 |
| Yüksek hacimli log / analytics | NDJSON / JSON Lines | Stream processing için birebir, satır satır işlenir 🔁 |
| Schema zorunlu, sözleşme tabanlı API | Protobuf / Avro | Binary = %40-60 daha küçük payload, şema evrimi kolay ✅ |
| Config dosyaları, CI/CD pipeline | YAML | İnsan dostu, comment desteği, anchor/alias ile DRY ⛔ |
| Frontend state / local storage | JSON | JSON.parse/stringify native, zero dependency 🛠 |
Kural basit: Veri ne kadar sık değişiyor ve ne kadar büyük? — sorusuna cevap verince format belli olur.
Aşağıda next.config.js ve bir React hook örneğinde, hangi formatı nerede kullanacağınızı gösteren yorum satırları var. Kopyalayıp projenize uyarlayabilirsiniz 👇
// next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
// 🟢 JSON: Küçük, sık değişen public config (feature flag, i18n key)
// next.js build anında inline edilir, ekstra network yok
publicRuntimeConfig: {
features: {
newDashboard: true,
darkModeDefault: false,
},
},
// 🟡 YAML: CI/CD pipeline'da kullanılan env-specific config
// .github/workflows/deploy.yml içinde `env:` bloğu olarak kalır
// Kodda YAML parse etme yok, sadece CI tarafında olur
// 🔵 Protobuf: Backend ile sözleşmeli, yüksek hacimli API çağrıları
// `npm i @bufbuild/protobuf` → generated TS tipleri ile type-safe fetch
// Sadece `api/` klasöründe kullan, client bundle'ına protobuf runtime ekleme
};
module.exports = nextConfig;
// hooks/useFeatureFlags.ts
import { useEffect, useState } from 'react';
// 🟢 JSON: Küçük config → fetch + parse son derece ucuz
// NOT: Büyük payload için NDJSON veya Protobuf tercih et
export function useFeatureFlags() {
const [flags, setFlags] = useState<Record<string, boolean>>({});
useEffect(() => {
// Public runtime config zaten window.__NEXT_DATA__.props.pageProps.config içinde
// Ekstra network YOK, parse maliyeti ≈ 0.1 ms
const cfg = (window as any).__NEXT_DATA__?.props?.pageProps?.config?.features;
if (cfg) setFlags(cfg);
}, []);
return flags;
}
api/ chunk'ında, ana sayfada yok ❌window objesinde hazır, ekstra fetch yok ⚡Hadi şimdi projenizdeki package.json ve docker-compose.yml dosyalarını bir gözden geçirin — hangisi yanlış formatta duruyor? 😉
Hazırsan iki format için basit bir "Kullanıcı Kartı" bileşeni isteyelim ve LLM’in ne ürettiğini, kaç token harcadığını ve bu da bize ne maliyette çıktığını inceleyelim 🎯.
Prompt:
"typescript reactile UserCard adında bir fonksiyonel bileşen yaz. Props:name:string,role:string,avatarUrl:string. Kartta avatar, isim ve rol gösterilsin. TailwindCSS sınıfları kullan."
import React from 'react';
interface UserCardProps {
name: string;
role: string;
avatarUrl: string;
}
export const UserCard: React.FC<UserCardProps> = ({ name, role, avatarUrl }) => (
<div className="max-w-sm mx-auto p-4 bg-white rounded-lg shadow-md">
<img
src={avatarUrl}
alt={`${name} avatar`}
className="w-20 h-20 mx-auto rounded-full mb-3 object-cover"
/>
<h3 className="text-lg font-semibold text-center text-gray-800">{name}</h3>
<p className="text-sm text-center text-gray-500">{role}</p>
</div>
);
Token Sayısı: ~ 210 token
Tahmini Maliyet (GPT‑4‑Turbo, $0.01/1K token): ≈ $0.0021 💰
Prompt:
"pugşablon motoru için user-card mixin’i yaz. Parametreler:name,role,avatarUrl. TailwindCSS sınıfları ile aynı görünümlü bir kart üret."
mixin user-card(name, role, avatarUrl)
.max-w-sm.mx-auto.p-4.bg-white.rounded-lg.shadow-md
img(
src=avatarUrl
alt=`${name} avatar`
class="w-20 h-20 mx-auto rounded-full mb-3 object-cover"
)
h3.text-lg.font-semibold.text-center.text-gray-800= name
p.text-sm.text-center.text-gray-500= role
Token Sayısı: ~ 165 token
Tahmini Maliyet (GPT‑4‑Turbo, $0.01/1K token): ≈ $0.00165 💰
İstersen bu verileri bir grafikle görselleştirebilirsin. Aşağıdaki snippet Jupyter/Colab ortamında çalışır:
import matplotlib.pyplot as plt
formats = ['TSX/JSX', 'Pug']
tokens = [210, 165]
costs = [t * 0.01 / 1000 for t in tokens] # $ per 1K token
fig, ax1 = plt.subplots()
ax1.bar(formats, tokens, color=['#61dafb', '#a86454'], alpha=0.7)
ax1.set_ylabel('Token Sayısı', color='#333')
ax1.tick_params(axis='y', labelcolor='#333')
ax2 = ax1.twinx()
ax2.plot(formats, costs, 'o-', color='#2c3e50', label='Maliyet ($)')
ax2.set_ylabel('Maliyet ($)', color='#2c3e50')
ax2.tick_params(axis='y', labelcolor='#2c3e50')
plt.title('🎯 TSX vs Pug – Token & Maliyet')
fig.tight_layout()
plt.show()
Ne öğrendik?
| Format | Token | Maliyet ($) | Not |
|---|---|---|---|
| TSX/JSX | ~210 | 0.0021 | Tip güvenliği + IDE desteği |
| Pug | ~165 | 0.00165 | Daha kompakt, daha az token |
Hangi formatı tercih edersen et, token bazlı maliyeti hesaba katarak büyük ölçekli LLM‑tabanlı kod üretim stratejinizi şekillendirebilirsin. 🎉
Token başına maliyet hikayenin tamamı değil 🎯. Aslında faturayı şişiren gizli aktörler var. Hadi onları tek tek ele alalım.
Çoğu sağlayıcı prompt cache sunuyor. Aynı sistem promptunu, aynı dosyaları veya uzun bağlamları tekrar gönderiyorsan, önbellek devreye girer.
temperature=0 dışında bir şey değişmiyorsa bile, bazı sağlayıcılar cache key'i yanlış hesaplıyor → para yakıyorsun ❗️İpucu: İstek göndermeden önce cache_control veya prompt_cache_key parametrelerini kontrol et. Yanlış konfigürasyon, %50-90'ar oranında tasarruf kaçırıyor.
| Model | Kullanım Alanı | Maliyet Farkı |
|---|---|---|
| GPT-4o / Claude 3.5 Sonnet | Karmaşık reasoning, kod, çok dilli | 10-30× daha pahalı |
| GPT-4o-mini / Haiku | Sınıflandırma, özetleme, basit QA | Bütçe dostu 💰 |
| Fine-tuned küçük model | Çok spesifik domain (ör. hukuk, tıp) | Eğitim maliyeti var ama inference ucuz |
Kuralım: İş yapabilen en ucuz modeli seç. Over-engineering maliyetli olur 🛠.
Strateji:
max_tokens limiti koy, model "sonsuza kadar" üretmesin ⛔max_tokens ve stop sequence'ler ayarlandı mı?Son söz: Maliyet optimizasyonu tek seferlik bir ayar değil, sürekli bir gözlem döngüsü 🔁. Metriklerini topla, dene, ölç, tekrar et.
Token maliyetini hala düşürebilir miyiz? Elbette! İşte birkaç "altın değerinde" ipucu 🎯
max_tokens ve stop Parametrelerini Kullan{
"max_tokens": 500,
"stop": ["\n\n", "###"]
}
Bu sayede model sonsuz döngüye girmez, cevap tam bitmeden kesilir ✅
| Model | Kullanım Alanı | Maliyet Avantajı |
|---|---|---|
| GPT-4o-mini | Basit sınıflandırma, özetleme | ~10x ucuz |
| Özel fine-tuned | Domain-specific görevler | Prompt boyutu ↓, kalite ↑ |
| Yerel modeller (Llama, Mistral) | Veri gizliliği kritikse | Token maliyeti = 0 🛠 |
Aynı sistem promptu + birkaç sabit few-shot her seferinde gönderiliyorsa → prompt cache (OpenAI, Anthropic) veya semantic cache (GPTCache, Redis + embedding) kur 🔁
Küçük bir değişiklik, ay sonunda dev bir fark yaratır. Deneme yanılma yapmaktan çekinme — her optimize edilen token, bütçene geri döner 💪
Hadi kısa bir özetle kapatalım:
Kısacası: Doğru format, hem geliştirici deneyimini hem de model performansını doğrudan etkiler. Projenizin büyüklüğü, ekibinizin alışkanlıkları ve entegre edeceğiniz araçlar dikkate alınıp en temiz, en hızlı ve en güvenli seçeneği tercih edin. 🚀
Bir sonraki yazıda tekrar görüşmek üzere — happy coding! ✨
Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.
All rights reserved