Program
Bir modeli ilk kez bir API çağrısıyla denerken, ilk yanıt bana çok az şey söyler. İlk Fable 5.1 çalıştırmam geçerli bir yapı ve genel bir plan döndürdü. Sohbet büyüdükten sonra neler olduğunu bilmek istedim: uygulama geçmişini eksiksiz koruyabiliyor mu, proje dışına çıkmadan dosyaları inceleyebiliyor mu, ilerlemeyi raporlayabiliyor mu ve maliyetin nereden geldiğini gösterebiliyor mu?
Fable 5.1’a genel bakışımız Claude Fable 5.1 overview, lansmanı, kıyaslamaları ve daha geniş model karşılaştırmalarını kapsar. Burada küçük bir Python çağrısıyla başlayıp bunun etrafında aracı döngüsü kuracağız. Son aracı bir özellik talebi alır, bir Flask projesini okur ve gerçekten incelediği dosyalara bağlı bir plan döndürür.
Şunları ele alacağız:
- Claude Fable 5.1 API çağrısı yapmak ve içerik bloklarını güvenle okumak
- Akıl yürütme effort’unu ayarlamak ve konuşma ortasında değiştirmek (beta)
- Bir sistem talimatının kapsamını tek bir tura sınırlamak (beta)
- Pydantic ile yapılandırılmış bir plan döndürmek
- Proje kök sınırı olan salt-okunur depo araçları eklemek
- Çok turlu araç döngüsü çalıştırmak
- Araç çağrıları arasında aracının ilerleme güncellemelerini okumak (beta)
- Yalnızca ekleme yapılan geçmişle düşünme bloklarını geçerli tutmak
- Tekrarlanan bağlamı önbelleğe almak ve istek maliyetini yayımlanan oranlardan tahmin etmek
- Retleri ele almak ve aracıya FastAPI üzerinden erişim sağlamak
Beta özellikleri tarihli başlıklar kullanır, bu yüzden yayına almadan önce Anthropic dokümanlarıyla karşılaştırın.
Bir Aracı Döngüsünde Claude Fable 5.1 Çalıştırmanın Maliyeti Nedir?
Bir aracı her turda aynı sistem istemini, araç tanımlarını ve depo bağlamını yeniden gönderir; bu nedenle faturayı belirleyen oran, giriş oranı değil, önbellek okuma oranıdır.
Fable 5.1, milyon başına 10 $ giriş belirteci ve milyon başına 50 $ çıkış belirteci maliyetine sahiptir; Fable 5 ile değişmedi. Önbellek okumaları milyon başına 0,25 $’dır (1 $’dan düştü) ve beş dakikalık önbellek yazmaları milyon başına 12,50 $’da kalır. Tam oran tablosu ve Anthropic’in tasarruf tahminleri için Claude Fable 5.1 guide yazımıza bakın.
Önbelleğe alınmış bir öneki okumak ucuzdur. Yazmak ise okuma oranının 50 katı olduğundan pahalıdır; bu yüzden döngü yalnızca bir önek birkaç kez geri okunduğunda karşılığını verir. Aşağıdaki maliyet dökümü gerçek bir çalıştırmada bunun nasıl sonuçlandığını ve hangi kategorinin gerçekten baskın olduğunu gösterir.
Belirteç tavanı bütçenizden değil modelden gelir. Fable 5.1 size yanıt başına 128K çıkış belirtecine kadar 1M belirteçlik bir bağlam penceresi verir ve max_tokens düşünme ile yanıt metninin toplamına katı bir sınır koyar. Yüksek effort’ta ikisi için de alan gerekir; bu nedenle aşağıdaki aracı döngüsü daha düzenli bir değer yerine 16.000 ayarlar.
Veri saklama, öncelik katmanı ve filigranlama
Kod yazmadan önce birkaç erişim ayrıntısı önemlidir. Bunlardan ikisi isteklerinizi doğrudan durduracaktır:
-
Fable 5.1, 30 günlük veri saklama gerektirir ve Anthropic erişimi yetkilendirmedikçe sıfır veri saklama altında kullanılamaz. Uygun olmayan bir çalışma alanından gelen istek, başka bir ipucu olmadan 400
invalid_request_errordöndürür. -
Model, Öncelik Katmanı’nda desteklenmez. Fable 5 desteklenir; bu da taşınanları yakalar.
-
Fable 5.1 metin çıktısı Anthropic’in metin filigranını taşır. Ek belirteç eklemez ve istek değişikliği gerektirmez.
Depo Farkında Bir Geliştirici Aracısı Oluşturmak İçin Claude Fable 5.1’i API Üzerinden Kullanın
İş akışımız iki aşamadan oluşur:
- Sınırlandırılmış bir inceleme döngüsü, izinli proje dosyalarını okur.
- Yapılandırılmış çıktılar kullanan son bir istek, bu bağlamı bir plana dönüştürür.
Örnek proje, yer imi kaydetme ve arama için küçük bir Flask JSON API’sidir; bir uygulama fabrikası, üç blueprint, bir yapılandırma modülü, modeller ve bir pytest paketi içerir. Koşan görev olarak hız sınırlamayı kullanıyorum; çünkü aracı, gerekli dosyaları ve testleri belirleyebilmeden önce uygulama kurulumunu, rotaları, yapılandırmayı ve testleri incelemek zorunda. Tüm kod ve örnek proje GitHub deposunda mevcuttur.

İstekler dosyalara tek bir sınırdan ulaşır. Görsel: Yazar.
Aracı yalnızca üç aracı kullanabilir: list_project_files, read_project_file ve get_project_metadata. Claude doğrudan dosya sistemine erişmez. Bir yol ister; o yolun izinli olup olmadığına kodunuz karar verir.
Python’da Claude Fable 5.1 API’sini Kurma
Ayrı bir Python ortamıyla başlayın ve API anahtarını sunucuda tutun.
Önkoşullar
Python 3.10 veya daha yenisi ve claude-fable-5-1 erişimi olan bir Anthropic API anahtarına ihtiyacınız var.
Bir API anahtarı oluşturmak için Claude Console’da oturum açın, API keys sayfasını açın, Create key’e tıklayın ve anahtarı kopyalayın. Amacını hatırlatacak bir ad vermek, bir son kullanma tarihi seçmek ve anahtarı güvenle saklamak en iyi uygulamadır.
SDK’yı kurun ve API anahtarını ekleyin
Sanal bir ortam oluşturun ve paketleri yükleyin:
python -m venv .venv
source .venv/bin/activate # macOS or Linux
.venv\Scripts\Activate.ps1 # Windows PowerShell
pip install anthropic==1.3.0 pydantic fastapi uvicorn python-dotenv
SDK’yı sabitleyin; çünkü beta özellikleri sık değişir. İlerleme güncellemeleri en az 1.1.0 gerektirir ve örnekler 1.3.0 kullanır.
Anahtarı bir .env dosyasına koyun ve ilk commit’ten önce .env’yi .gitignore’a ekleyin. Anahtar, tarayıcıda veya erişilebilir bir depoda değil, kontrolünüzdeki bir sunucuda olmalıdır. Onu açığa çıkarmak, giriş, çıkış ve önbellek işlemleri genelinde yetkisiz API kullanımına ve ücretlere yol açabilir.
ANTHROPIC_API_KEY=sk-ant-your-key-here
Bunu yaptıktan sonra, istemci anahtarı kendisi bulur.
Python’da İlk Claude Fable 5.1 API Çağrınızı Yapın
Üzerine bir şey inşa etmeden önce olabildiğince küçük bir API isteği gönderin.
İlk API isteğini gönderin
İstemciyi başlatın, bir kullanıcı mesajı gönderin ve yanıt meta verilerini yazdırın:
from anthropic import Anthropic
from dotenv import load_dotenv
load_dotenv()
client = Anthropic()
MODEL = "claude-fable-5-1"
response = client.messages.create(
model=MODEL,
max_tokens=512,
messages=[{"role": "user", "content": "Reply in one sentence to confirm the API connection is working."}],
)
text = next((b.text for b in response.content if b.type == "text"), None)
print(text if text is not None else f"No text returned ({response.stop_reason})")
print(f"Model: {response.model}")
print(f"Stop reason: {response.stop_reason}")
print(f"Input tokens: {response.usage.input_tokens}")
print(f"Output tokens: {response.usage.output_tokens}")
print(f"Request ID: {response._request_id}")

İlk çağrı metin ve meta veriler döndürür. Görsel: Yazar.
next(...) çağrısı ilk metin bloğunu seçer. Uyarlamalı düşünme her zaman açıktır ve devre dışı bırakılamaz; bu nedenle bir yanıt bir düşünme bloğuyla başlayabilir. thinking: {"type": "disabled"} göndermek, onu kapatmak yerine 400 döndürür. Düşünme bloğu ilk geldiğinde, response.content[0].text bir istisna fırlatır.
Çözüm, sabit bir konum varsaymak yerine blok türüne göre filtrelemektir. Ayrıca response._request_id’yi de kaydedin; çünkü Anthropic desteği onu bir isteği izlemek için kullanır.
İşte o planlama ve effort örneklerinde kullanılan istek. Aracının birkaç dosyayı incelemesini gerektirir:
feature_request = (
"Add rate limiting to the public API endpoints so one client cannot exhaust "
"the search endpoint or brute force the token endpoint."
)
Effort düzeylerini ve belirteç sayılarını karşılaştırırken bu metni değiştirmeyin. Böylece sonuçlar farklı bir istemi değil, API ayarlarını açıklar.
output_config ile akıl yürütme effort’unu ayarlayın
Effort’u output_config üzerinden ayarlayın. low, medium, high, xhigh ve max değerlerini kabul eder. API varsayılanı high’dır.
response = client.messages.create(
model=MODEL,
max_tokens=8192,
output_config={"effort": "high"},
messages=[{"role": "user", "content": feature_request}],
)
Effort, belirteç kullanımını, araç davranışını ve gecikmeyi etkileyebilir. Aynı özellik talebini dört effort düzeyinin her birinde üçer kez çalıştırdım; tablo ortalamaları gösterir:
|
Effort |
Saniye |
Düşünme belirteçleri |
Toplam çıkış belirteçleri |
Maliyet |
|---|---|---|---|---|
|
|
7.7 |
111 |
173 |
$0.0093 |
|
|
8.1 |
129 |
186 |
$0.0099 |
|
|
7.9 |
136 |
199 |
$0.0106 |
|
|
20.0 |
151 |
1,764 |
$0.0888 |
Düşünme belirteçleri toplam çıkış belirteçlerine dahildir; dolayısıyla iki sütunu birleştirmeyin. Bu çalıştırmalarda low, medium ve high gecikme ve maliyette birbirine yakın kaldı.
xhigh iki buçuk kat daha uzun sürdü, neredeyse dokuz kat daha fazla çıkış belirteci üretti ve sekiz kat daha pahalıya mal oldu.
Özet: high ile başlayın, rutin adımlar için medium ’a düşürün ve yalnızca kendi testleriniz ölçülebilir bir iyileşme gösterdiğinde daha yüksek düzeyler kullanın. low effort’ta model, bir getirme aracını çağırmak yerine hafızadan yanıt verebilir. Bir turun taze bilgiye ihtiyacı varsa bunu belirtin veya düzeyi yükseltin.
Aracının kapsamını bir sistem istemiyle sınırlayın
Sistem istemi, aracının davranışını tanımlar:
SYSTEM_PROMPT = """You are a senior engineer who turns feature requests into implementation plans for an existing codebase.
Stay inside the requested feature. Do not propose unrelated refactors, dependency upgrades, or style changes.
If a file or dependency you need does not exist, say so plainly instead of inventing it.
Write in plain sentences and do not use em dashes.
Finish with concrete guidance: what changes, where, in what order, what could break, and which tests to add."""
Anthropic’in isteme yönelik rehberi, modelin görevi genişletebileceğini veya çok erken durabileceğini belirtir. İstem, kapsam içinde kalmasını ve somut rehberlikle bitirmesini söyler. Çıktı biçimini daha sonra bir şema yönetir.
Pydantic ile Yapılandırılmış Bir Plan Döndürün
Pydantic ile planı tanımlayın; böylece uygulamanız onu doğrulayabilir ve başka koda aktarabilir:
from pydantic import BaseModel, Field
class FeaturePlan(BaseModel):
summary: str = Field(description="One or two sentences on what will be built.")
implementation_steps: list[str]
files_to_modify: list[str]
risks: list[str]
tests: list[str]
response = client.messages.parse(
model=MODEL,
max_tokens=8192,
system=SYSTEM_PROMPT,
messages=[{"role": "user", "content": feature_request}],
output_format=FeaturePlan,
)
if response.stop_reason == "refusal":
category = (
response.stop_details.category
if response.stop_details and response.stop_details.category
else "unspecified"
)
print(f"Declined: {category}")
elif response.parsed_output is None:
print(f"No plan. Stop reason: {response.stop_reason}")
else:
print(response.parsed_output.summary)
messages.parse() Pydantic modelini bir JSON şemasına dönüştürür, gönderir, yanıtı doğrular ve parsed_output üzerinde türlenmiş bir nesne döndürür. Yapılandırılmış çıktılar genel kullanıma açıktır; bu nedenle beta başlığı gerekmez. Önce stop_reason’ı kontrol edin; çünkü daha sonra ele alınacak bir ret, şemayı atlar ve ayrıştıracak hiçbir şey bırakmaz.
Girişteki o genel sonuç bir şeyi doğru yaptı: göremediği dosyaları adlandırmadı. Bir şema yapıyı doğrular, olgusal dayanağı değil.
Claude Fable 5.1 ve Fable 5: API Geçiş Değişiklikleri
Araçlar eklemeden önce zorunlu araç kısıtlamalarını, düşünme bloğu uyumluluğunu ve yalnızca ekleme yapılan geçmişi hesaba katın.
-
Fable 5.1, zorunlu araç seçimini reddeder. Aşağıdaki araç döngüsü bölümü hatayı ve bunun yerine kullanılan
autoyapılandırmasını gösterir. -
Düşünme blokları yalnızca tek yönlü uyumludur. Fable 5.1, daha eski Claude modellerinden gelen blokları okur; ancak hiçbir eski model onun bloklarını okuyamaz.
Bir yönlendirici veya geri dönüş sohbeti daha eski bir modele taşıdığında, API hedef model görmeden önce uyumsuz blokları kaldırır. Kalan geçmiş yerinde kalır; fakat eski model bu bloklar olmadan plan yapmak zorundadır.
Önceki turları düzenlemek, sonradan gelen düşünme bloklarını geçersiz kılar. Bu, geçmiş kırpmayı ve istemci tarafı özetlemeyi bozabilir.
Geçiş rehberi değişikliklerin tamamını kapsar.
Salt-Okunur Depo Araçları Ekleyin
Şimdi modele salt-okunur araçlar aracılığıyla depo bağlamı verin.
Salt-okunur araçları tanımlayın
Araç katmanı iki parçadan oluşur: erişim kurallarını zorlayan Python işlevleri ve Claude’un çağırabileceği şemalar.
Yolları proje köküne kısıtlayın
Salt-okunur, güvenliyle aynı şey değildir. Bir model ../../.env’ı en az config.py kadar kolay isteyebilir; bu yüzden koruma, istem yerine kodunuzda olmalıdır:
def _resolve(self, relative_path: str) -> Path:
relative = Path(relative_path)
if relative.is_absolute() or relative.drive:
raise ToolError(f"path is outside the project root: {relative_path}")
cursor = self.root
for part in relative.parts:
cursor /= part
if cursor.is_symlink():
raise ToolError(f"symlinks are not followed: {relative_path}")
candidate = (self.root / relative).resolve()
# After resolving "..", the path still has to sit under the allowed root.
if candidate != self.root and self.root not in candidate.parents:
raise ToolError(f"path is outside the project root: {relative_path}")
if candidate.name in DENY_NAMES:
raise ToolError(f"reading {candidate.name} is not allowed")
return candidate
Mutlak yolları ve sembolik bağlantı bileşenlerini reddedin; ardından yolu çözüp proje kökü altında kaldığını doğrulayın. ../.env istemek “path is outside the project root” döndürür. Döndürülen araç hatası, aracının izinli dosyalarla devam etmesine olanak tanır.
Sıkı araç şemaları tanımlayın
Okuyucu sınıfı, Python’un neyi açabileceğini kontrol eder. Claude ayrıca isteyebileceği üç eylemi tanımlayan JSON şemalarına ihtiyaç duyar:
EMPTY_SCHEMA = {
"type": "object",
"properties": {},
"additionalProperties": False,
}
TOOLS = [
{
"name": "list_project_files",
"description": "List readable text files in the project.",
"input_schema": EMPTY_SCHEMA,
"strict": True,
},
{
"name": "read_project_file",
"description": "Read one text file relative to the project root.",
"input_schema": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"],
"additionalProperties": False,
},
"strict": True,
},
{
"name": "get_project_metadata",
"description": "Read project metadata and dependency manifests.",
"input_schema": EMPTY_SCHEMA,
"strict": True,
},
]
strict model bir aracı seçtiğinde argümanları kontrol eder. Bir araç çağrısını zorlamaz; bu da Fable 5.1 için önemlidir.
Çok turlu araç döngüsünü çalıştırın
Temel döngüyle başlayın: araçları gönderin, stop_reason’ı inceleyin, isteneni çalıştırın, sonuçları ekleyin ve tekrarlayın.
MAX_AGENT_TURNS = 8
reader = ProjectReader("sample_project")
messages = [{"role": "user", "content": feature_request}]
for turn in range(1, MAX_AGENT_TURNS + 1):
response = client.messages.create(
model=MODEL,
max_tokens=16000,
system=SYSTEM_PROMPT,
tools=TOOLS,
messages=messages,
)
if response.stop_reason == "refusal":
return declined(response.stop_details.category)
if response.stop_reason == "max_tokens":
return cutoff()
if response.stop_reason != "tool_use":
messages.append({"role": "assistant", "content": response.content})
break
messages.append({"role": "assistant", "content": response.content})
results = []
for block in response.content:
if block.type != "tool_use":
continue
output, is_error = reader.run(block.name, block.input)
results.append({
"type": "tool_result",
"tool_use_id": block.id,
"content": output,
"is_error": is_error,
})
messages.append({"role": "user", "content": results})
else:
return turn_limit()
MAX_AGENT_TURNS model isteklerini sınırlar, harcamayı değil; bu yüzden gerekirse ayrı bir maliyet limiti uygulayın. Döngü, refusal, max_tokens ve tool_use durumlarını doğrudan ele alır; diğer durdurma nedenleri inceleme aşamasını bitirir. is_error alanı, bir yolun reddedildiğini modele bildirir; böylece başka bir eylem seçebilir.
Zorunlu araç seçimi neden 400 döndürür
Fable 5’te ilk çağrıyı tool_choice: {"type": "any"} ile zorlayabiliyordunuz. Fable 5.1, istek çalıştırılmadan şu hatayı döndürür:
tool_choice: type "tool" and "any" are not supported for this model.
Zorunlu çağrılar her zaman açık olan düşünmeyi atlayacaktı. tool_choice’ı auto’da tutun, yukarıda tanımlanan sıkı şemaları kullanın ve bir adımın araca ihtiyacı olduğunda araçları istemde adlandırın.
Fable 5.1 bazen tur başına bir araç çağrısı yapar; Fable 5 ise birkaçını toplu hâlde yapardı. Bu, gidiş-dönüş sayısını artırır. İsteme şu satırı ekleyin: “Bağımsız dosyaları tur başına bir yerine aynı turda isteyin.” Örnek bir çalıştırma, sayısı değişmekle birlikte, dokuz bağımsız dosya isteğini toplu yaptı.
Claude Fable 5.1 Yanıtlarını ve İlerleme Güncellemelerini Yayın (Stream) Edin
Metin akışı, yanıt içeriğini üretilirken yayınlar; ilerleme güncellemeleri ise araç çağrıları arasındaki duraklamaları kapsar.
Metin yanıtlarını yayınlayın
Tam proje, akışı başlatmadan önce context_system() kullanarak SYSTEM_PROMPT ’u bir proje özetiyle birleştirir:
with client.messages.stream(
model=MODEL,
max_tokens=8192,
system=context_system(),
messages=[{"role": "user", "content": feature_request}],
) as stream:
for chunk in stream.text_stream:
print(chunk, end="", flush=True)
final = stream.get_final_message()
print(f"\nOutput tokens: {final.usage.output_tokens}")
get_final_message() akış boşaldığında kullanım ve durdurma nedeni ile derlenmiş mesajı verir. Akış parçalarının tam JSON içermesi garanti edilmez; bu yüzden ayrıştırmadan önce son mesajı bekleyin.
Araç çağrıları arasında ilerlemeyi gösterin
Metin akışı, araç çağrıları sırasındaki gecikmeleri kapsamaz. Fable 5.1, araç çağrılarından önce kısa ilerleme güncellemeleri yazabilir. Varsayılan thinking.display değeri "omitted" altında, ilerlemeye özgü düşünme blokları boştur; model yine de normal bir metin girişi üretebilir.
display: "updates" ve thinking-display-updates-2026-08-18 beta başlığıyla, API dokümantasyonu, akıl yürütme gizliyken okunabilir bir ilerleme güncellemesini boş olmayan bir thinking bloğu olarak tanımlar. Bu proje için canlı çalıştırmalarda thinking alanı boş kaldı ve okunabilir durum, tool_use’dan hemen önce normal bir text bloğu olarak geldi. Bu nedenle yardımcı işlev her iki blok türünü de kontrol eder ve döngü, onu yalnızca tool_use ile biten turlarda çağırır:
PROGRESS_BETA = "thinking-display-updates-2026-08-18"
response = client.beta.messages.create(
model=MODEL,
max_tokens=16000,
betas=[PROGRESS_BETA],
thinking={"type": "adaptive", "display": "updates"},
system=SYSTEM_PROMPT,
tools=TOOLS,
messages=messages,
)
def status_lines(response) -> list[str]:
lines = []
for block in response.content:
if block.type == "thinking":
text = (block.thinking or "").strip()
elif block.type == "text":
text = (block.text or "").strip()
else:
continue
if text:
lines.append(text)
return lines
İlerleme mesajları, modelin okumayı planladığı dosyaları açıklar: “Uygulama kablolarını, config’i, eklentileri, public ve auth rotalarını ve mevcut testleri okuyacağım; çünkü hız sınırlaması buralara bağlanır.” Bu mesajları gösterin ve boş blokları yok sayın.

Aracı, ilerlemeyi raporlarken dosyaları okur. Görsel: Yazar.
Fable 5.1, özellikle daha yüksek effort’ta, Fable 5’e göre bu tür mesajları daha az yazar. Arayüzünüz düzenli güncellemeler gerektiriyorsa bir açılış satırı, ilerleme mesajları ve kapanış özeti isteyin.
Konuşma Ortasında Claude Fable 5.1 Effort’unu Değiştirin
Sıradaki özellik oldukça hoş. Hepimizin bildiği gibi, depo aracısı her turda aynı akıl yürütme derinliğine ihtiyaç duymaz.
Turlar arasında effort’u değiştirin
Bir aracı döngüsünde, rutin getirme turları için effort’u düşürün ve son planlama turu için yeniden yükseltin.
mid-conversation-output-config-2026-07-01 beta başlığıyla, yalnızca effort düzeyini değiştiren bir sistem mesajı ekleyebilirsiniz:
EFFORT_BETA = "mid-conversation-output-config-2026-07-01"
messages.append({"role": "system", "content": [], "output_config": {"effort": "low"}})
messages.append({"role": "user", "content": "Summarize the repository evidence in five words."})
response = client.beta.messages.create(
model=MODEL,
max_tokens=4096,
betas=[EFFORT_BETA],
output_config={"effort": "high"},
messages=messages,
)
Yeni düzey, geçerli turun ortasında değil, bir sonraki kullanıcı turundan itibaren uygulanır ve istem önbelleğini geçersiz kılmaz. İstekler arasında üst düzeyde output_config.effort değiştirmek onu geçersiz kılar.
Aracı üst düzey ayarı high’da tutar; rutin getirme öncesinde mesaj başına medium yönergesi ve son plan öncesinde high yönergesi ekler. Eşleşen bir test, düşük effort’ta 18 çıkış belirteci; önceki ayarda ise 76 kullandı. Bu sonucu beklenen bir azalma değil, örnek olarak değerlendirin.
Bir tur için sistem talimatı uygulayın
Son planlama sırasında ek dosya okumalarını engellemek için tur kapsamlı bir talimat kullanın.
Bir sistem mesajında clear_at: "next_user_message" ayarlayın; mid-conversation-system-clear-at-2026-08-21 beta başlığıyla. API, metnini geçerli tur için bir sistem talimatı olarak işler; ardından bir sonraki kullanıcı mesajından sonra göstermeyi bırakır. messages’ta kalır; böylece önceki geçmiş değişmez, önbellek eşleşmeye devam eder ve temizlenen mesaj giriş belirteci maliyeti oluşturmaz.
SCOPED_SYSTEM_BETA = "mid-conversation-system-clear-at-2026-08-21"
messages.append({"role": "system", "content": [], "output_config": {"effort": "high"}})
messages.append({"role": "user", "content": "Write the implementation plan now."})
messages.append({
"role": "system",
"content": (
"For this turn only: do not request more files. Base the plan on what "
"you have already read, and name only paths you actually opened."
),
"clear_at": "next_user_message",
})
response = client.beta.messages.create(
model=MODEL,
max_tokens=16000,
betas=[EFFORT_BETA, SCOPED_SYSTEM_BETA],
tool_choice={"type": "none"},
output_config={"format": {"type": "json_schema", "schema": plan_schema()}},
system=agent_system(),
tools=TOOLS,
messages=messages,
)
tool_choice={"type": "none"}, son isteğin başka bir aracı çağırmasını engeller. Kapsamlı talimat, planı aracının halihazırda incelediği dosyalarla sınırlar. Bir hatırlatma ekleyip bir sonraki istekte silmeyin. Bu düzenleme, sonraki düşünme bloklarını geçersiz kılar.
Claude Fable 5.1 Düşünme Bloğu 400 Hatalarını Düzeltin
The block is bound to a different conversation hatası, bir düşünme bloğundan önceki geçmişin değiştiği anlamına gelir. Her Fable 5.1 düşünme bloğu, tam olarak ondan önce gelen sistem istemine, araç tanımlarına ve mesajlara bağlıdır.
Sonuç, hesabınızın ne zaman oluşturulduğuna bağlıdır.
-
31 Ağustos 2026 veya sonrasında oluşturulan hesaplar, bloğun farklı bir sohbete bağlı olduğunu belirten 400 alır.
-
Daha önce oluşturulan hesaplarda API uyumsuzluğu kaydeder; ancak yalnızca istek
thinking.block_binding.prefix_mismatch_behaviorayarlandığında harekete geçer.
Bunu thinking-binding-controls-2026-08-01 beta başlığı, thinking.block_binding.prefix_mismatch_behavior için "drop_block" değeri ve input_transformations dizisiyle tespit edebilirsiniz. Düzenlenmiş bir geçmiş reason: "prefix_binding_mismatch" olarak görünür. Bu kontrolü entegrasyonunuza karşı bir kez çalıştırın.
Aşağıdaki işlemler uyumsuzluğu tetikler:
-
Daha sonraki turlar korunurken önceki bir turu düzenlemek, yeniden sıralamak veya kaldırmak
-
İstek başına metni önceki bir tura enjekte edip bir sonraki istekte kaldırmak
-
Konuşma ortasında üst düzey
systemisteminin veyatoolsdizisinin içeriğini veya sırasını değiştirmek -
Daha sonraki bir istekte bir görsel veya belge URL’sinden farklı baytlar sunmak
Bunların her birinin bağlamaları sağlam tutan bir karşılığı vardır:
-
Talimatları,
system’ı düzenlemek yerine konuşma ortası sistem mesajlarıyla ekleyin. -
Araçları, üst düzey diziyi değiştirmek yerine konuşma ortası araç değişiklikleriyle değiştirin.
-
Geçmişi, düzenleme sayılmayan sunucu tarafı bağlam düzenleme veya sıkıştırmayla kırpın.
-
Düşünme bloklarını aynen geri gönderin.
cache_control işaretleyicilerini taşımak ve istek düzeyindeki effort’u değiştirmek güvenlidir ve düşünme-bloğu bağlamalarını geçersiz kılmaz. Ancak üst düzey effort’u değiştirmek istem önbelleğini yeniden başlatır; bu yüzden önbelleğe alınmış önekin yerinde kalması gerektiğinde mesaj başına effort kullanın.
İstem Önbellekleme ve Claude Fable 5.1 API Maliyeti
Aşağıdaki çalıştırma taze girişi, önbellek yazmalarını, önbellek okumalarını ve çıkış maliyetlerini ayırır.
Otomatik istem önbellekleme ekleyin
İstem önbellekleme, turlar arasında tekrarlanan bağlamın maliyetini azaltır. Büyüyen geçmiş, kırılma noktasının nerede olması gerektiğini değiştirir; bu yüzden otomatik önbellekleme burada daha basit uyum sağlar.
Üst düzey bir cache_control alanı, her istekte kırılma noktasını en son önbelleğe alınabilir bloğa taşır:
response = client.beta.messages.create(
model=MODEL,
cache_control={"type": "ephemeral"},
system=system,
tools=TOOLS,
messages=messages,
# Other request fields...
)
Fable 5.1’da 512 belirteçten kısa bir önbelleğe alınabilir önek, cache_control ile işaretlense bile önbelleğe alınmaz. API onu normal şekilde işler ve iki önbellek sayacı için sıfır döndürür. 583 belirteçlik bir öneki yazmak 0,0073 $; sonraki turda onu okumak 0,00015 $ tuttu. İkinci tur yine de yeni kısmını önbelleğe yazmak zorundaydı; dolayısıyla bir önbellek isabeti tüm giriş maliyetini ortadan kaldırmadı.
Önbellek farkındalıklı API maliyetini tahmin edin
response.usage taze girişi, önbellek oluşturmayı, önbellek okumalarını ve çıkışı ayrı ayrı raporlar. Dört sayacı da kendi başına fiyatlayın; yalnızca giriş ve çıkışı toplamak, önbellek yazma maliyetini gizler ve önbellek isabetlerinin fiyatını abartır.
İşte üç turda 12 dosya okuyan ve bir son plan üreten tam bir çalıştırmadan maliyet dökümü:
|
Kalem |
Belirteçler |
Tahmini maliyet |
Pay |
|---|---|---|---|
|
Çıkış |
5,713 |
$0.2857 |
%59,4 |
|
Önbellek yazmaları |
15,426 |
$0.1928 |
%40,1 |
|
Taze giriş |
50 |
$0.0005 |
%0,1 |
|
Önbellek okumaları |
6,549 |
$0.0016 |
%0,3 |
|
Toplam |
27,738 |
$0.4806 |
%100 |
Önbellek okumaları bu tahminin binde yarısından daha azını oluşturdu. Fable 5’in eski oranında, çalıştırma $0.4806 yerine yaklaşık $0.4855 olurdu. Tasarruf, her tur çok daha fazla bağlamı yeniden kullandığında artar.
Bu çalıştırmada, tahminin neredeyse %60’ını çıkış, yaklaşık %40’ını önbellek yazmaları üretti. Burada kullanılan beş dakikalık oranda, bir önbellek yazma belirteci, bir önbellek okuma belirtecinden 50 kat daha pahalıdır. Bir saatlik önbellek yazması 80 kat daha pahalıdır.
Claude Fable 5.1 Retlerini ve Geri Dönüşleri Yönetin
Bir ret ile başarısız bir istek farklı uygulama davranışı gerektirir.
Çıktıyı ayrıştırmadan önce retleri tespit edin
Çıkıştan önceki bir ret, HTTP 200 ile stop_reason: "refusal", boş içerik ve stop_details olarak gelir. Kategorisi null olabilir. Akışta daha sonraki bir ret, uygulamanın atması gereken kısmi çıktıyı izleyebilir. try/except bloğu bu iki durumu da yakalamaz.
response = client.messages.create(model=MODEL, max_tokens=8192, messages=messages)
if response.stop_reason == "refusal":
category = (
response.stop_details.category
if response.stop_details and response.stop_details.category
else "unspecified"
)
return f"This request was declined ({category})."
Onu bir uygulama durumu olarak ele alın. İzinli bir istek belirsizse, daha kesin biçimde yeniden yazın. Amacı sınıflandırıcıyı aşmak olan bir yeniden deneme mantığı kurmayın.

Bir ret HTTP 200 olarak gelir. Görsel: Yazar.
Sunucu tarafı geri dönüşü yapılandırın
Sunucu tarafı geri dönüş, reddedilen bir isteği başka bir modelde fallbacks: "default" ve server-side-fallback-2026-07-01 beta başlığıyla yeniden deneyebilir. Fable 5.1 için izin verilen hedefler Opus 4.8 ve Opus 5’tir.
Varsayılan geri dönüş yalnızca ret kategorisinin önerilen bir hedefi olduğunda çalışır. Test edilen bir reasoning_extraction reti geri dönüşü tetiklemedi; her retin yeniden deneneceğini varsaymak yerine usage.iterations’ı inceleyin. Daha önce belirtildiği gibi, daha eski bir modele geçmek Fable 5.1 düşünme bloklarını da bırakır.
Claude Fable 5.1 Aracısını FastAPI ile Sunun
Yerel aracı artık aynı iş akışını bir HTTP API üzerinden sunabilir.
Plan uç noktasını oluşturun
Yalnızca yerel bir betiğe ihtiyacınız varsa bu bölümü atlayın. Bir web hizmeti için FastAPI’yi AsyncAnthropic ile kullanın. Yaşam döngüsü işleyicisinde süreç için tek bir istemci oluşturun. Şemayı ve istemleri mevcut aracı modülünden içe aktarın.
@asynccontextmanager
async def lifespan(_: FastAPI):
global client
client = AsyncAnthropic()
try:
yield
finally:
await client.close()
@app.post("/plan", response_model=PlanResponse)
async def create_plan(body: PlanRequest):
reader = resolve_project(body.project)
messages, totals, turns, tool_calls = await inspect(reader, body.feature_request)
plan, final_usage = await write_plan(messages)
totals.add(final_usage)
return PlanResponse(plan=plan, turns=turns, tool_calls=tool_calls, usage=as_usage(totals))
Çağıranın bir yol değil, bir proje adı gönderdiğine dikkat edin. resolve_project() onu küçük bir izinli kök kümesinden birine eşler; böylece bir istek, sunucunun rastgele bir yeri okumasını isteyemez. Bu hizmet, retleri uygulama tercihi olarak 422’ye eşler. Claude API’si bunları HTTP 200 olarak döndürür.
uvicorn app:app --reload ile çalıştırın. Etkileşimli dokümantasyon http://localhost:8000/docs adresinde mevcuttur.
Uç nokta, tahmini maliyetle birlikte bir plan döndürür. Video: Yazar.
/plan/stream uç noktası incelemeyi bir arka plan görevinde çalıştırır, ilerleme ve araç olaylarını bir asyncio.Queue’ya yerleştirir ve bunları StreamingResponse üzerinden yayınlar. Akış kapandığında, üreteç arka plan görevini iptal eder. Depodaki Streamlit ara yüzü aynı olay akışını işler.
Streamlit, aracının canlı ilerlemesini gösterir. Video: Yazar.
Claude Fable 5.1 Aracı Dağıtım Kontrol Listesi
Önceden oluşturulan sınırlar ve kontroller hizmetin parçası olmaya devam eder. Dağıtımdan önce, yerel bir çalıştırmada görünmeyen operasyonel parçaları ekleyin.
-
SDK’nın 429 ve 5xx yanıtları için varsayılan iki yeniden denemesini gözden geçirin; ardından
max_retriesve zaman aşımlarını hizmetin gecikme bütçesine uyacak şekilde ayarlayın -
Bir istek zaman aşımı belirleyin ve mevcut SSE görev iptalinin bir istemci bağlantısı kesildiğinde bekleyen işi durdurduğunu doğrulayın
-
Her çalıştırma için model kimliğini, SDK sürümünü, istek kimliğini, durdurma nedenini ve dört belirteç kategorisini kaydedin
-
Artan önbellek yazmaları, çıkış belirteçleri, retler ve tavan tura ulaşan çalıştırmalar için uyarı verin
-
Hesabın saklama ayarının model gereksinimiyle eşleştiğini doğrulayın
-
SDK’yı sabitleyin ve her sürümden önce beta başlıklarını yeniden kontrol edin
Opus 5 veya Sonnet 5 Yerine Ne Zaman Claude Fable 5.1 Kullanılır?
- Anthropic, makul bir varsayılan olarak Opus 5’i önerir.
- Opus 5 uzun depo analizi, zor hata ayıklama veya büyük bağlamlı aracısal görevlerde yetersiz kaldığında Fable 5.1’i test edin.
- Depo çalışmaları ve gündelik görevler için, kalite, gecikme ve maliyet açısından Sonnet 5 ve Opus 5’i karşılaştırın.
- Sınıflandırma, çıkarım, kısa yanıtlar ve daha basit istekler için Sonnet 5 iyi bir varsayılandır; en kolay görevler için Haiku 4.5 da yeterince güçlü olabilir.
Yalnızca daha yeni olduğu için Fable 5.1’i seçmeyin. Tek bir istek hâlâ effort ve yapılandırılmış çıktıları kullanabilir; yayın (streaming) da çalışır. Burada kullanılan döngüden veya tekrarlanan önek önbelleklemeden fayda sağlamaz.
Son Düşünceler
İlk çağrımdan gelen genel plan, aracı depoyu okuduktan sonra ancak işe yarar hâle geldi. Tamamlanan çalıştırmada, üç turda 12 dosya incelendi; tahmini maliyetin %99,5’ini ise çıkış ve önbellek yazmaları oluşturdu. Yol sınırını ve yalnızca ekleme yapılan geçmişi korur; ardından, modelin depo araçlarını atlamasına yol açmadan maliyeti düşürüp düşürmediğini görmek için daha düşük effort’u test ederdim.
Tek bir yanıt görevi çözebiliyorsa, yapılandırılmış çıktılarda durun. Yanıtın depo dosyalarına dayanması veya çağrılar arasında ilerlemeyi raporlaması gerekiyorsa araç döngüsünü kullanın.
Model seçimi ayrıntıları için Introduction to Claude Models kursumuzu öneririm. İsteme ve aracı iş akışlarına yönelik olarak Software Development with Cursor kursumuza bakın.
SSS
Claude Fable 5.1 kod kadar görselleri de okuyabilir mi?
Evet. Görsel girdi kabul eder ve grafikler ile PDF’leri okuyabilir. Depo planının buna ihtiyacı olmadığı için ana örnekte görmeyi dışarıda bıraktım. Bu aracıya bir UI değişikliğini planlama özelliği ekleseydim, mevcut ekran görüntüsünü özellik isteğiyle gönderirdim. Küçük görsel ayrıntılar görevi etkilemiyorsa önce ölçeğini küçültün.
Fable 5’ten geçtikten sonra aracım neden yavaşladı?
Modeli suçlamadan önce araç sonuçlarını kontrol edin. Önceki toplu istek talimatı zaten varsa hem sayıları hem de boyutlarını karşılaştırın. Mevcut okuyucu her dosyayı 40.000 baytta sınırlar. Bu hâlâ çok büyükse, araç yalnızca ilgili bölümleri döndürebilsin diye satır aralığı veya arama argümanları ekleyin.
Claude Fable 5.1 neden 400 invalid_request_error döndürüyor?
Önce yeniden denemeyin. Bir invalid_request_error genellikle değişmesi gereken bir istek biçimine veya hesap ayarına işaret eder. Bu projede olası nedenler: zorunlu tool_choice, uyumsuz bir saklama ayarı, korunmuş düşünmeyle düzenlenmiş bir önek veya eşleşen başlığı olmadan gönderilen bir beta alanı. Belirtilen nedeni düzeltin ve isteği tekrar gönderin.
Kaynak dosyaları mı yoksa bir özeti mi önbelleğe almalıyım?
Şu kuralı kullanıyorum: tam aynı kod birkaç tur boyunca önemliyse kaynak dosyaları önbelleğe alın. Sonraki adımlar yalnızca mimariye veya dosya haritasına ihtiyaç duyuyorsa bir özeti önbelleğe alın. Özet daha az belirteç maliyeti getirir; ancak son planın ihtiyaç duyduğu o tek satırı atlayabilir.
Batch API bu aracı çalıştırabilir mi?
Tek başına hayır. Batch API, bireysel Messages istekleri gönderir; bu istemci tarafı araç döngüsünü çalıştırmaz. Canlı ilerleme gerekmediğinde kendi kendine yeter depo incelemeleri için kullanırım. Tam döngüyü partilerde çalıştırmak, bir partinin araç isteklerini işleyip sonraki partiyi göndermeden önce kendi kodunuzu gerektirir.
Veri hatları, bulut ve YZ araçları üzerinde çalışan; aynı zamanda DataCamp ve gelişmekte olan geliştiriciler için pratik, yüksek etkili eğiticiler yazan bir veri mühendisi ve topluluk inşacısıyım.
