VPS uzerinde yapay zeka ajansi maliyet kontrolu
VPS uzerinde calisan yapay zeka ajanlarinda beklenmedik faturalari onlemek icin token sinirlari, prompt caching ve dongu kisitlamalarini nasil uygulayacaginizi ogrenin.
Her zaman çalışan bir yapay zeka aracısının maliyet artışını önleme
Bir VPS (sanal özel sunucu) üzerinde yapay zeka aracısı maliyet kontrolü, aracı başlamadan önce belirlenen üst sınırlara dayanır; çünkü aracı çalışırken kimse sayacı sürekli izlemez. Her yanıtı max_tokens ile sınırlandırın, döngü yinelemelerini kendi kodunuz içinde kısıtlayın, istemin (prompt) değişmeyen kısımlarını önbelleğe alın ve hangi işin ne kadar harcama yaptığını görmek için her yanıtın kullanım verilerini günlükleyin. Sunucu kirası sabit bir aylık ücrettir. Model API'si ise token başına ücretlendirilir ve denetimsiz bir döngü, sessizce çok sayıda token harcayabilir.
Bu rehber, halihazırda var olan ve sahip olduğunuz bir sunucudan Messages API'sini çağıran bir aracı varsayar. Bir VPS üzerinde Claude ile yapay zeka aracısı oluşturma konusu, sistemin teknik altyapısını ele almaktadır.
Why an unattended agent is a different cost shape
An interactive session has a human in it. When the model goes down a wrong path or reads a 40,000-line log, the person watching stops it. An unattended agent has no such brake: it runs until the loop ends, then a timer starts it again.
Frequency is the multiplier people miss. A job on a five-minute schedule runs 288 times a day and about 8,640 times a month. Whatever one run costs, that is the figure you multiply. Many "always-on" agents do not need to be on. They need to answer within some number of minutes, which is a schedule.
An agent also pays for things a chat window does not.
- Tool definitions ride along on every request. The tool-use system prompt costs 290 tokens on Claude Opus 4.8 with
tool_choiceofautoornone, and 410 withanyortool. The bash tool adds 325 more. Every MCP server you attach adds its schemas to that weight, MCP being the model context protocol. - Tool results are input tokens. A command that prints 8,000 lines puts 8,000 lines into the next request, and into every request after it in that turn.
- Fetched pages are input tokens. An average 10 kB web page is roughly 2,500 tokens and a 500 kB research PDF roughly 125,000.
max_content_tokenstruncates the text ones only, because it "applies to text content, not to binary content such as PDFs". Bound a PDF withmax_usesandallowed_domainsinstead. - Web search is priced per search, at $10 per 1,000 searches, however many results come back. A search that errors is not billed.
None of that is expensive once. All of it is expensive 8,640 times.
Sert limitler ve esnek limitler farklı sorunları çözer
max_tokens zorunludur. Bu, düşünme ve yanıt metni dahil olmak üzere tek bir isteğin toplam çıktısı üzerindeki sert bir sınırdır. Claude bu sınırı asla aşmaz ve model bu sayıyı göremez. Sınıra ulaşıldığında stop_reason: "max_tokens" hatası alınır ve yanıt kesilir. Ajanlar için kritik nokta şudur: araç kullanım döngüsündeki her istek kendi max_tokens değerini taşır, dolayısıyla bu sınır görevi değil, tek bir yanıtı kısıtlar. 4.000 token değerinde on araç çağrısı, o tur için 40.000 tokenlik bir tavan oluşturur.
Görev bütçesi tavsiye niteliğindedir. task_budget, output_config içinde yer alır ve modele düşünme, araç çağrıları, araç sonuçları ve çıktı dahil olmak üzere tüm ajan döngüsü için ne kadar tokeni olduğunu bildirir.
resp = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
betas=["task-budgets-2026-03-13"],
output_config={"task_budget": {"type": "tokens", "total": 64000}},
messages=messages,
)"Görev bütçeleri sert bir sınır değil, esnek bir ipucudur." Claude bir işlem sırasında bu bütçeyi aşabilir ancak çıktı üzerindeki zorunlu sınır hala max_tokens değerindedir. "Geri sayım yalnızca model tarafından görülebilir" ve yanıtlar kalan bütçe bilgisini içermez. Kabul edilen minimum task_budget.total değeri 20.000 tokendır; daha düşük değerler 400 hatası döndürür. İş için çok küçük bir bütçe, reddetmeye benzer bir davranışa yol açar; bu durumda model görevi daraltır veya erken durdurur.
Bir detay, tasarruf etmek yerine maliyeti artırır. İstemciniz her takip eden istekte task_budget.remaining değerini azaltırsa, değişen değer bu değeri içeren tüm önbelleğe alınmış önekleri geçersiz kılar. Bu değeri yalnızca ilk istekte bir kez ayarlayın.
Görev bütçeleri Claude Fable 5, Claude Opus 4.8 ve Claude Opus 4.7 sürümlerinde beta aşamasındadır. Claude Sonnet 5 ve Claude Haiku 4.5, Not supported olarak listelenmiştir ve görev bütçeleri Claude Code için geçerli değildir; bu nedenle tmux içinde ayrılmış Claude Code oturumu oturum hijyenine bağlıdır.
Üçüncü sınır Claude Console içinde yer alır: ajana kendi çalışma alanını atayın, ardından aylık harcama limiti ve dakika başına hız limitleri belirleyin. "Varsayılan Çalışma Alanı için limit belirleyemezsiniz" ve "Çalışma alanı limitlerinin toplamı daha yüksek olsa bile, organizasyon genelindeki limitler her zaman geçerlidir". Bir eşik değerine ulaşıldığında sizi sınırdan önce uyarması için harcama bildirimleri ekleyin.
İş bazında model seçimi ve çabanın gerçek etkisi
Model seçimi, her iş için ayrı verilmesi gereken bir karardır. Temmuz 2026 itibarıyla, milyon token başına giriş ve çıkış maliyetleri şöyledir: Claude Fable 5 için 10$ ve 50$, Claude Opus 4.8 ve Opus 4.7 için 5$ ve 25$, Claude Sonnet 5 için 3$ ve 15$, Claude Haiku 4.5 için 1$ ve 5$. Sonnet 5, "31 Ağustos 2026 tarihine kadar milyon giriş/çıkış token'ı başına 2$/10$ tutarındaki tanıtım fiyatlandırması" geçerli olduğundan, şu an için liste fiyatının altında kalmaktadır. Yalnızca günlük satırlarını sınıflandıran bir adım için Opus kullanılmasına gerek yoktur. Yoğun bir programı karşılayacak ücretsiz bir kota da bulunmamaktadır; çünkü Claude API'nin ücretsiz bir katmanı yoktur, yalnızca kayıt sırasında verilen küçük bir kredi mevcuttur.
İkinci kaldıraç çabadır (effort). output_config.effort; low, medium, high, xhigh ve max değerlerini kabul eder ve varsayılan değer high'dir; bu nedenle high değerini açıkça ayarlamak, belirtmemekle aynı sonucu verir. Düşük çaba ayarı, yalnızca düşünme süresini kısaltmakla kalmaz: belgelerde belirtildiği üzere, Claude'un daha az araç çağrısı yapmasını ve işlemleri tek bir adımda birleştirmesini sağlar. Bir aracı (agent) üzerinde bu daha büyük bir tasarruf sağlar; çünkü kaçınılan her araç çağrısı, hiç gerçekleşmeyen tam bir istek anlamına gelir.
Buradaki tuzak, çaba ayarının önbellekleme (cache) ile çelişmesidir. İstekler arasında bu değeri değiştirmek, istem önbelleğini geçersiz kılar. Belgelenmiş örnekte, 2. istek cache_read_input_tokens: 3546 değerini bildirirken; çabanın yüksekten orta seviyeye çekildiği 3. istek, 3546'lık cache_creation_input_tokens ve 0'lık cache_read_input_tokens değerini bildirmiştir. Bu nedenle çaba ayarını iş yükleri arasında değiştirin, ancak önbelleğe alınmış tek bir görüşme içerisinde asla değiştirmeyin. Önbelleği bozmadan derinliği yönetmek için bunu istem (prompt) içerisinde yapın: en son kullanıcı mesajına eklenen "Düşünmeden doğrudan yanıtla." gibi bir satır, önceki kesme noktalarının korunmasını sağlar.
Düşünme token'ları çıkış oranları üzerinden faturalandırılır ve max_tokens limitinden düşülür; bu nedenle kesilmiş bir yanıt genellikle düşünme sürecinin bütçeyi tükettiği anlamına gelir. Sayısal değer için usage.output_tokens_details.thinking_tokens kısmını okuyun. Claude token faturasını gerçekte ne doldurur başlıklı yazı, ölçüm sistemini detaylıca açıklar.
Kararlı öneki önbelleğe alın ve yanlışlıkla bozmayı bırakın
Bir önbellek yazma işlemi, beş dakikalık önbellekte temel girdi fiyatının 1,25 katına, bir saatlik önbellekte ise 2 katına mal olur. Bir önbellek okuma işlemi 0,1 katına mal olur; bu nedenle "önbelleğe alma, 5 dakikalık süre için (1,25x yazma) sadece bir önbellek okumasından sonra veya 1 saatlik süre için (2x yazma) iki önbellek okumasından sonra kendini amorti eder".
Tek bir satır, bunun neden sürekli çalışan bir aracı (agent) için uygun olduğunu açıklar: "Önbellek, önbelleğe alınan içerik her kullanıldığında ek bir maliyet olmaksızın yenilenir." Beş dakikalık önbelleğe karşı iki dakikada bir tetiklenen bir iş, önekini tek bir yazma işlemiyle tüm gün boyunca sıcak tutar.
Önbelleği fark etmeden kaybetmenin üç yolu.
Değişen bir önek. "Önbellek önekleri şu sırayla oluşturulur: tools, system ve ardından messages." Bu sıradaki herhangi bir bayt değişikliği, kendisinden sonra gelen her şeyi geçersiz kılar ve araç tanımlarını düzenlemek tüm önbelleği geçersiz kılar. Klasik, kendi kendine verilen zarar, sistem istemindeki (system prompt) bir zaman damgası veya çalıştırma kimliğidir (run id): bu durumda her istek farklı bir önek taşır, 1,25x maliyetle yeni bir girdi yazar ve hiçbir şeyi geri okumaz. Bunun belirtisi, birbirine benzer görünen çağrılarda usage.cache_read_input_tokens değerinin 0 olmasıdır. Değişken metni en yeni kullanıcı mesajına taşıyın.
Çok kısa bir önek. Her modelin minimum önbelleğe alınabilir uzunluğu vardır; bunun altındaki istekler önbelleğe alınmadan işlenir ve "hata döndürülmez". Rakamlar, Claude Opus 4.8 ve Claude Sonnet 5 üzerinde 1.024 token, Claude Haiku 4.5 üzerinde ise 4.096 token içerir; bu nedenle bir işi Sonnet'ten Haiku'ya taşımak, önbelleğe almayı sessizce devre dışı bırakabilir.
Geriye dönük bakış (lookback) sınırını aşan bir konuşma. "Geriye dönük bakış penceresi 20 bloktur." Sistem, kesme noktası (breakpoint) başına en fazla 20 konumu kontrol eder ve ardından durur. Belgelenmiş örnekte, 35. blokta bir kesme noktası bulunan ve 35 blok tutan bir tur, 35'ten 16'ya kadar olan blokları kontrol eder; 15. bloktaki önceki turun girdisi pencerenin dışında kalır ve bu nedenle eşleşme (hit) olmaz. Tur başına birkaç araç kullanımı ve araç sonucu bloğu ekleyen bir aracı, iki veya üç turda 20 sınırını aşar. İstek başına dört kesme noktanız vardır, bu yüzden birini yakın tarihli mesajlar için kullanın.
Bekleyebilecek işlemleri Batches API'ye gönderin
Tüm kullanım, hem girdi hem de çıktı için standart API fiyatlarının %50'si üzerinden ücretlendirilir. Toplu işleme (batch processing) asenkrondur ve "çoğu toplu işlem 1 saatten kısa sürede tamamlanır". Sonuçlar, tüm istekler bittiğinde veya 24 saat sonra (hangisi önce gerçekleşirse) hazır olur. Bu tipik bir durumdur, garanti edilmez.
processing_status durumunu ended olarak görünene kadar sorgulayın. errored, canceled veya expired dönen istekler faturalandırılmaz. Harcama limitine güveniyorsanız bir uyarı: "toplu işlemler, Workspace için yapılandırılmış harcama limitini biraz aşabilir."
İndirimler birikimlidir ve bir toplu işlem beş dakikadan uzun sürebileceği için dokümantasyon, bağlam paylaşan toplu işlemler için bir saatlik önbellek kullanımını önerir. Bu nedenle işi bölün: bir kişinin veya webhook'un beklediği işlemler canlı yolda kalmalı; gecelik özetler veya dünün log sınıflandırması gibi işlemler ise yarı fiyatına toplu işleme gönderilmelidir.
Her yanıtın kullanım alanlarını kendi veri deponuza kaydedin
Kaydetmediğiniz bir harcamayı ilişkilendiremezsiniz. Her yanıt size maliyetini bildirir.
u = resp.usage
row = {
"job": job_name,
"model": resp.model,
"uncached_input": u.input_tokens,
"cache_write": u.cache_creation_input_tokens,
"cache_read": u.cache_read_input_tokens,
"output": u.output_tokens,
"stop_reason": resp.stop_reason,
}Her API çağrısı için bir satırı, iş adınızla etiketleyerek bir JSON-lines dosyasına ekleyin. Bir hafta sonra hangi işin harcama yaptığını, hangisinin sadece meşgul göründüğünü söyleyebilirsiniz. cache_read değerini izleyin: sıfırlardan oluşan bir sütun, self-hosted bir aracıdaki en yaygın maliyet hatasıdır.
Bir alanın yanlış anlaşılması kolaydır. input_tokens yalnızca son önbellek kesme noktasından sonraki tokenları sayar, bu nedenle gerçek istem boyutu total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens değeridir. Büyük bir istemde input_tokens: 400 bildiren bir aracı ucuz değildir: geri kalanı önbellekten gelmiştir.
Göndermeden önce sayın. Token sayımı ücretsizdir ve hız sınırları mesaj oluşturmadan ayrıdır; bu nedenle, büyük boyutlu bir eki ödeme yaparak keşfetmek yerine count_tokens kullanarak reddedin. Sonuç bir tahmindir, bu yüzden model bazında yeniden ölçüm yapın ve başka bir sağlayıcının tokenlaştırıcısından gelen bir sayımı asla yeniden kullanmayın. Claude Opus 4.7 ve sonraki Opus modelleri, Claude Fable 5 ve Claude Sonnet 5, "aynı metin için yaklaşık %30 daha fazla token üreten" daha yeni bir tokenlaştırıcı kullanır. Claude Sonnet 4.6 ve öncesi ile Claude Haiku 4.5 gibi modeller ise bir öncekini kullanır.
Yetkili görünüm için Admin API, kullanımı https://api.anthropic.com/v1/organizations/usage_report/messages adresinde ve maliyeti https://api.anthropic.com/v1/organizations/cost_report adresinde raporlar. Her ikisi de bir yönetici anahtarı (sk-ant-admin01-...) gerektirir, x-api-key: $ANTHROPIC_ADMIN_KEY olarak anthropic-version: 2023-06-01 ile kullanılır ve bucket_width=1d, group_by[]=model ve api_key_ids[]= parametrelerini kabul eder. Bir sınırlama: "Admin API, bireysel hesaplar için kullanılamaz."
Son parametre ucuz bir ilişkilendirme hilesidir: her işe kendi API anahtarını verin, api_key_ids[] ile filtreleyin ve raporu group_by[]=api_key_id ile anahtar bazında bölün. Filtre çoğuldur, gruplandırma boyutu ise tekildir. Anahtarları kod içinde değil, bir VPS üzerinde ilk Claude API uygulaması örneğinde olduğu gibi ortam değişkenlerinde tutun.
Döngüyü sınırlandırın, çünkü başka hiçbir şey bunu yapmayacak
Burada sınırlı bir yineleme sayısı isteğe bağlı değildir. Döngü size aittir, dolayısıyla sayaç da size aittir:
for step in range(MAX_STEPS): # MAX_STEPS = 12, never "while True"
resp = client.messages.create(...)
if resp.stop_reason != "tool_use":
break
else:
log.warning("job %s hit MAX_STEPS=%d, giving up", job_name, MAX_STEPS)Yukarıdaki tavan değerlerin hiçbiri bunu sizin yerinize yapmaz: max_tokens yalnızca tek bir yanıtı sınırlar ve modele yalnızca bir görev bütçesi bildirilir. Barındırılan bir ürün sizi burada durdururdu; tıpkı Claude'un tek bir turdaki araç çağrısı sınırı özelliğinin çok fazla çağrı yapan bir oturumu durdurması gibi. Ancak kendi yazdığınız bir döngü, siz bir tane ekleyene kadar herhangi bir güvenlik önlemi olmadan çalışır.
İşlemin dışına ikinci bir fren koyun. İşi kalıcı bir süreç yerine bir systemd zamanlayıcısından çalıştırın ve servis biriminizde RuntimeMaxSec= ayarını yapın. RuntimeMaxSec=600 ile, askıda kalan bir çalışma siz fark edene kadar dönmek yerine on dakika sonra sonlandırılır. Bir programı systemd servisi ve zamanlayıcısı olarak çalıştırma konusu birim dosyalarını ele almaktadır. Bir çalışmanın ne yaptığını journalctl -u triage-agent.service --since "1 hour ago" ile okuyun.
Yeniden denemeleri de sınırlandırın, çünkü sonsuza kadar yeniden deneyen bir işleyici her denemeyi faturalandırır. Bir 429 veya 500 hatası, bekleme süresi (backoff) ile birkaç denemeyi hak eder. 400 hatası ise hiçbir denemeyi hak etmez, çünkü aynı istek aynı şekilde başarısız olmaya devam edecektir.
AI ajanı maliyet kontrolü kendi verilerinizi okumakla başlar
Sürekli çalışan bir ajanın maliyetini kimse size söyleyemez; çünkü maliyet, çalışma başına token sayısı ile günlük çalışma sayısının çarpımıdır ve her iki değişken de size aittir. Ajanı bir kez çalıştırın, kaydettiğiniz kullanım satırını okuyun ve bunu kendi planınızla çarpın. İki gün sonra maliyet raporunu bu hesaplamayla karşılaştırın. İkisi uyuşmadığında, aradaki fark neredeyse her zaman bozuk bir önbellekten veya varsaydığınızdan daha uzun süren bir döngüden kaynaklanır.
Bu durum bir API anahtarı gerektirir, çünkü ajan Messages API'sini çağıran kendi programınızdır. Kendi etkileşimli çalışmalarınız için, hangi Claude planı çalışma şeklinize uygun konusu abonelik tarafını kapsamaktadır. Buradaki her fiyat ve limit Temmuz 2026 itibarıyla Anthropic dokümantasyonu ile doğrulanmıştır; bu nedenle bir bütçe oluşturmadan önce fiyatlandırma sayfasını tekrar inceleyin.
FAQ
7/24 çalışan bir yapay zeka aracını VPS üzerinde çalıştırmanın maliyeti nedir?
İki tür fatura kalemi vardır ve bunlardan yalnızca biri öngörülebilir. Sunucu maliyeti sabit aylık bir ücrettir. Model API'si ise token başına ücretlendirilir; dolayısıyla maliyet, tek bir çalıştırmanın tükettiği miktar ile ne sıklıkla çalıştığının çarpımıdır. Anthropic, kendi kendine barındırılan ve sürekli çalışan bir aracı için herhangi bir rakam yayınlamamaktadır, bu nedenle belirtilen her sayıyı bir tahmin olarak değerlendirin. Gerçek bir çalıştırmadan usage günlüğünü alın ve bunu kendi zamanlamanızla çarpın.
max_tokens ile görev bütçesi (task budget) arasındaki fark nedir?
max_tokens zorunludur ve model tarafından görülmez. Düşünme süreci dahil olmak üzere tek bir isteğin çıktısını sınırlar; bu sınıra ulaşılması stop_reason: "max_tokens" hatasına yol açar. Görev bütçesi ise bunun tam tersidir: modele bu sayı bildirilir ve aracı döngüsünü buna göre ayarlar; ancak "Görev bütçeleri kesin bir sınır değil, yumuşak bir ipucudur" ve uygulanan limit hala max_tokens değeridir.
Neden cache_read_input_tokens değerim aracım için her zaman sıfır?
Çünkü önek (prefix) çağrılar arasında değişiyor veya önbelleğe alınamayacak kadar kısa. Bunun yaygın nedeni, sistem istemine (system prompt) eklenen bir zaman damgası veya çalıştırma kimliğidir: önbellek önek üzerinden anahtarlanır, bu nedenle herhangi bir bayt değişikliği ondan sonra gelen her şeyi geçersiz kılar. Araç tanımlarını veya effort değerini değiştirmek de aynı sonucu doğurur. Diğer bir neden ise boyuttur; daha kısa istemler önbelleğe alınmaz ve bu durumda herhangi bir hata döndürülmez.
Bir yapay zeka aracının sonsuz döngüye girmesini nasıl engellerim?
Döngü kodunuzdaki yinelemeleri sayın ve sabit bir maksimum değerde durdurun; çünkü max_tokens tek bir yanıtı sınırlar, ancak bir aracı birçok yanıt oluşturur. Sürecin dışında bir duvar saati sınırı ekleyin: işi RuntimeMaxSec= ayarlanmış bir systemd zamanlayıcısı ile başlatın, böylece takılı kalan bir çalıştırma planlanan zamanda sonlandırılır. Yeniden denemeleri de sınırlayın, çünkü bir yeniden deneme döngüsü her denemeyi faturalandırır.
Tek bir Claude API anahtarı için harcama limiti belirleyebilir miyim?
Belgelenen harcama limiti anahtar bazlı değil, çalışma alanı (workspace) bazlıdır; bu nedenle araca kendi çalışma alanını atayın ve aylık harcamasını orada sınırlayın. "Varsayılan Çalışma Alanı (Default Workspace) üzerinde limit belirleyemezsiniz". Harcama bildirimleri ekleyerek bir eşik değerine ulaşıldığında ilk önce sizin uyarılmanızı sağlayın. İlişkilendirme için her işe kendi anahtarını verin ve ardından kullanım raporunu group_by[]=api_key_id ile gruplandırın.