Skip to content

Yaniti Okumak

JSON yanitinin anatomisi -- result dizisi, cost_usd, session_id

10 dk okuma
Anatomy of the JSON envelope: nested structure showing response fields, result content blocks, session_id, cost_usd, and usageresponse{}type: "result"subtype: "success"result: [...]content_blocktype: "text"content_blocktype: "tool_use"...session_id"abc-123-..."cost_usd0.003412usageinput_tokens: 2048output_tokens: 456

claude -p ciktisini jq '.result' ile yonlendirip cevabinizi aliyorsunuz. Is tamam — ta ki otomasyonunuz sessizce bir izin reddini kacirana, bir butce asimini gormezden gelene veya konusmayi devam ettirmek icin ihtiyac duydugunuz session_id’yi kaybedene kadar. result alani buzda yalnizca goruen kisim.

Bu bolum, --output-format json uzerine otomasyon kurarken tam olarak neyi cikaracaginizi, neyi loglayacaginizi ve nelere dikkat edeceginizi bilmeniz icin JSON zarfindaki her alani inceliyor.

Gotcha

Alan adlari farkli kurallara uyar: ust duzey usage nesnesi snake_case kullanir (input_tokens), modelUsage ise camelCase kullanir (inputTokens). Bunlari karistirmaktan kaynaklanan sayisiz ayristirici hatasinin hatalarini ayikladik. Her zaman hangi nesneden okudugunuzu kontrol edin.

Ust Duzey Alanlar

Islevleri, anlamlari ve ne zaman onemli olduklariyla birlikte karsilasacaginiz her alan.

Her --output-format json yaniti ayni ust duzey anahtar setini dondurur. Bazilari her script icin zorunludur; digerl yalnizca butce uygulamasi veya izin denetimi gibi belirli senaryolarda onem kazanir.

Tam Alan Referansi

AlanTipNe Soyluyor
typestringTamamlanmis bir yanit icin her zaman “result”. stream-json modunda once baska olay turleri gorulur, ancak son satir her zaman bu tiptedir.
subtypestringNormal tamamlanmada “success”. Cagri, —max-budget-usd ile belirlenen harcama limitine ulastiginda “error_max_budget_usd”.
is_errorbooleanBasarida false. result okumadan once her yanit isleyicisinde bunu ilk kontrol edin.
duration_msnumberArac yurutmesi dahil tum cagri icin gecen sure. Uctan uca gecikme takibi icin bunu kullanin.
duration_api_msnumberYalnizca API cagrisinda gecen sure, yerel arac yurutmesi haric. duration_ms ile duration_api_ms arasindaki fark araclarin ne kadar surdugunu gosterir.
num_turnsnumberBu cagridaki konusma tur sayisi. Tek bir istem-yanit 1’dir. Cok turlu arac kullanim donguler bu sayiyi arttirir.
resultstringMetin yaniti — —output-format text’in dondurduguyle ayni. Yanit birden fazla arac cagrisi icerse bile her zaman bir string’dir.
stop_reasonstring”end_turn” Claude’un dogal olarak bitirdigi anlamina gelir. “max_tokens” ciktinin token limitinde kesildigini gosterir.
session_idstringBu konusma icin UUID. Sonraki bir cagri icin konusmayi devam ettirmek uzere —resume’a iletin.
total_cost_usdnumberUSD cinsinden maliyet. Yeni oturumlarda: cagri basi maliyet. —resume oturumlarinda: oturum baslangicindan itibaren tum turlarin kumulatif toplami. Oturum mekanigi icin Bolum 5’e bakin.
usageobjectDuz token dokumu: input_tokens, output_tokens, cache alanlari, server_tool_use ve service_tier.
modelUsageobjectModel bazinda token dokumu, model ID’sine gore anahtarlanmis. Bu, birden fazla model kullanirken onemli hale gelir (Bolum 17).
permission_denialsarrayIzin sisteminin yurutulmesini engelledigi araclar. Bos dizi hicbir seyin reddedilmedigi anlamina gelir. Plan modu is akislarinda hata ayiklamak icin kritiktir.
fast_mode_statestring”off” veya “on”. Claude Code’un hizli modunun (basit gorevler icin daha kucuk bir model kullanan) aktif olup olmadigini gosterir.
uuidstringBu belirli yanit icin benzersiz tanimlayici. session_id’den farklidir — bir oturum birden fazla yanit icerebilir ve her birinin kendi uuid’si vardir.

result Alani

result alani her zaman Claude’un son metin yanitini iceren bir string’dir. Bu, cagri sirasinda ne olursa olsun gecerlidir — Claude birden fazla arac cagirsa, dosya okusa, kod yazsa ve birden fazla tur boyunca bash komutlari calistirsa bile result tek bir string’e sikilmis son metin ciktisidir.

stop_reason degeri "end_turn" ise yanit tamamdir. "max_tokens" ise Claude cikti token limitine ulasti ve yanit kesildi. Bu alani kontrol ederek kesilmeyi tespit edebilir ve devam icin oturumu devam ettirip ettirmemeye karar verebilirsiniz:

Terminal window
# Check for truncation and resume if needed
RESPONSE=$(claude -p "Write a long essay" --output-format json)
STOP=$(echo "$RESPONSE" | jq -r '.stop_reason')
SESSION=$(echo "$RESPONSE" | jq -r '.session_id')
if [ "$STOP" = "max_tokens" ]; then
claude -p "Continue" --resume "$SESSION" --output-format json
fi
Gotcha

result alani, Claude yanit sirasinda birden fazla arac kullansa bile her zaman bir string’dir. Burada yapilandirilmis arac ciktisi bulamazsiniz — yalnizca tum arac cagrilari tamamlandiktan sonra Claude’un olusturdugu son metin. Bireysel arac cagrilarini ve sonuclarini gormek icin bunun yerine stream-json modunu kullanin.

Kullanim ve Maliyet Alanlari

Zarf iki duzey token muhasebes icerir: duz toplam icin usage ve model bazinda ayrintı icin modelUsage.

usage Nesnesi

"usage": {
"input_tokens": 3,
"cache_creation_input_tokens": 0,
"cache_read_input_tokens": 15635,
"output_tokens": 6,
"server_tool_use": {
"web_search_requests": 0,
"web_fetch_requests": 0
},
"service_tier": "standard",
"cache_creation": {
"ephemeral_1h_input_tokens": 0,
"ephemeral_5m_input_tokens": 0
}
}

input_tokens sayisi yalnizca API’ye gonderilen onbellege alinmamis tokenlari yansitir. cache_read_input_tokens sayisi istem onbelleginden sunulan token sayisini gosterir — bunlar onemli olcude daha ucuzdur. Ilk cagrinizda sistem istemi onbellege alinirken cache_creation_input_tokens degerinin yukseldigi gorulur; sonraki cagrilarda cache_read_input_tokens devreye girer.

server_tool_use alt nesnesi web arama ve web getirme gibi yerlesik sunucu tarafi araclarini izler. service_tier alani istegi hangi API katmaninin isledigini onaylar — genellikle "standard".

modelUsage Nesnesi

"modelUsage": {
"claude-opus-4-6": {
"inputTokens": 3,
"outputTokens": 6,
"cacheReadInputTokens": 15635,
"cacheCreationInputTokens": 0,
"costUSD": 0.0079825,
"contextWindow": 200000,
"maxOutputTokens": 32000
}
}

Bu nesne model ID’sine gore anahtarlanmistir ve --fallback-model kullandiginizda zorunlu hale gelir. Claude farkli bir modele geri donerse burada iki girdi gorursunuz — her model icin birer tane — her biri kendi token sayilari ve maliyetiyle. contextWindow ve maxOutputTokens alanlari modelin limitlerini gosterir ve istemlerinizin pencereye sigdigini dogrulamak icin kullanislidir.

Maliyet Alani Tuzagi

Bir izleme panosunda maliyetlerin neden yanlis gorundugunun hatasini ayiklamak icin 2 saat harcadik — sorun, devam ettirilen bir oturumda total_cost_usd’yi kontrol ettigimizdi. Deger kumulatiftir, tur bazinda degildir.

Yeni oturum: total_cost_usd = yalnizca bu cagrinin maliyeti. Devam ettirilen oturum: total_cost_usd = oturum baslangicindan itibaren tum turlarin toplami.

Devam ettirilen bir oturumda yalnizca son turun maliyetini almak icin onceki yanitin total_cost_usd degerini mevcut olandan cikarin — veya modelUsage icindeki model bazinda costUSD degerini kullanin.

Hata Yonetimi

Hatalar iki alanin birlikte calismasi ile ortaya cikar: is_error ve subtype. Basarili bir yanit her zaman is_error: false ve subtype: "success" degerlerine sahiptir. Bir seyler ters gittiginde desen degisir.

En yaygin hata alt tipi, --max-budget-usd ile belirlediginiz butce limitini asan cagrilarda tetiklenen "error_max_budget_usd"’dir. Bu durumda result alani normal bir yanit yerine hata mesajini icerir:

Terminal window
# Set a budget to see the error envelope when exceeded
$ claude -p "Write a detailed essay" --max-budget-usd 0.05 --output-format json
{
"type": "result",
"subtype": "error_max_budget_usd",
"is_error": true,
"result": "Budget exceeded: the request cost more than the allowed $0.05",
"total_cost_usd": 0.05,
"session_id": "..."
}

Savunma deseni basittir — result’a erismeden once her zaman is_error’u kontrol edin:

const data = JSON.parse(output);
if (data.is_error) {
console.error(`Error (${data.subtype}): ${data.result}`);
process.exit(1);
}
// Safe to use data.result here

permission_denials dizisi, arac kullanimi senaryolari icin hata yonetimini tamamlar. Claude, izin sisteminin engelledigi bir araci kullanmaya calistiginda, arac adi bu dizide gorulur. Cagrinin kendisi yine de basarili olabilir (is_error: false ile), ancak Claude’un yaniti reddedilen eylemi gerceklestiremedigini yansitir. Plan modu is akislarinda bu diziyi kontrol etmek kritiktir — Claude’un ne yapmak istedigini ancak izin verilmedigini size soyler.

Try This

Bir izin reddini tetikleyin ve yaniti inceleyin:

claude -p “Write hello to /tmp/test.txt” —permission-mode plan —output-format json | jq ‘.permission_denials’

Kac red gorunuyor? Hangi arac engellendi? Simdi ayni istemi default modunda calistirin — red dizisi degisiyor mu?

Tam Aciklamali Zarf

Tam JSON Zarfiartifacts/01/json_output.json
1{
2 "type": "result",A
3 "subtype": "success",B
4 "is_error": false,
5 "duration_ms": 1998,C
6 "duration_api_ms": 1976,
7 "num_turns": 1,
8 "result": "Hello CLI Test",D
9 "stop_reason": "end_turn",
10 "session_id": "0e639165-79b1-4bd4-bb0f-4cb4c15115d4",E
11 "total_cost_usd": 0.0079825,F
12 "usage": {
13 "input_tokens": 3,
14 "cache_creation_input_tokens": 0,
15 "cache_read_input_tokens": 15635,G
16 "output_tokens": 6,
17 "server_tool_use": {
18 "web_search_requests": 0,
19 "web_fetch_requests": 0
20 },
21 "service_tier": "standard",
22 "cache_creation": {
23 "ephemeral_1h_input_tokens": 0,
24 "ephemeral_5m_input_tokens": 0
25 }
26 },
27 "modelUsage": {
28 "claude-opus-4-6": {
29 "inputTokens": 3,
30 "outputTokens": 6,
31 "cacheReadInputTokens": 15635,H
32 "cacheCreationInputTokens": 0,
33 "costUSD": 0.0079825,
34 "contextWindow": 200000,
35 "maxOutputTokens": 32000
36 }
37 },
38 "permission_denials": [],
39 "fast_mode_state": "off",
40 "uuid": "e1382b50-c891-4cb9-b9be-a2bda5df6edd"
41}
AHer zaman "success" veya "error_max_budget_usd" -- isleyicinizi buna gore dallandirin
Bresult alanini okumadan once bu boolean'i ilk kontrol edin
CYalnizca API suresi (1976ms) ve toplam sure (1998ms) -- 22ms fark yerel ek yuktur
DMetin yaniti, arac kullanindan bagimsiz olarak her zaman bir string
EKonusmayi --resume ile devam ettirmek icin bu UUID'yi kaydedin
FKumulatif oturum maliyeti -- bu basit cagri icin $0.008
GOnbellekten sunulan 15.635 token -- dusuk maliyetle sistem istemi yeniden kullanimi
HModel bazinda dokum -- model ID'sine gore anahtarlanmis, baglam penceresi limitlerini gosterir
IBos dizi = hicbir arac engellenmedi. Dolu dizi = izin sistemi mudahale etti
Tip

Komut satirinda jq ile herhangi bir alani cikartin. Bir dizi cagri icin maliyet takibi: claude -p ”…” —output-format json | jq ‘.total_cost_usd’. Oturum zincirleme icin: jq -r ‘.session_id’ yapip sonraki cagrinizda —resume’a iletin.

Bunu Uygulamada Gorun

Bir uretim sisteminin session_id icin init olayini ve cost_usd icin result olayini ayristirmak uzere stream-json’u nasil kullandigini MR Inceleyici Olusturun, Bolum 1: Baslatma ve Inceleme bolumunde gorun.

Now Do This

Otomasyon scriptlerinizden birine | jq ‘{cost: .total_cost_usd, turns: .num_turns, denials: (.permission_denials | length)}’ ekleyin. Engellenen eylemleri yakalayacak, maliyetleri izleyecek ve tur sayilarini takip edeceksiniz — bunlarin hepsi gormezden gelebileceginiz uc alandan.